From 1d1b8d3290a166499c1e141c5698ff0643f40742 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 31 Mar 2020 15:14:11 +0300 Subject: [PATCH] [FIR-TEST] Update cfg dumps according to previous commits --- .../resolve/cfg/annotatedLocalClass.dot | 79 +- .../testData/resolve/cfg/binaryOperations.dot | 262 ++- .../cfg/booleanOperatorsWithConsts.dot | 468 +++-- .../testData/resolve/cfg/complex.dot | 243 ++- .../testData/resolve/cfg/emptyWhen.dot | 55 +- .../resolve/cfg/flowFromInplaceLambda.dot | 574 +++--- .../testData/resolve/cfg/initBlock.dot | 94 +- .../resolve/cfg/initBlockAndInPlaceLambda.dot | 113 +- .../inplaceLambdaInControlFlowExpressions.dot | 212 ++- .../testData/resolve/cfg/jumps.dot | 379 ++-- .../resolve/cfg/lambdaAsReturnOfLambda.dot | 109 +- .../resolve/cfg/lambdaReturningObject.dot | 70 +- .../testData/resolve/cfg/lambdas.dot | 261 ++- .../resolve/cfg/localClassesWithImplicit.dot | 422 +++-- .../testData/resolve/cfg/loops.dot | 479 +++-- .../cfg/postponedLambdaInConstructor.dot | 105 +- .../testData/resolve/cfg/postponedLambdas.dot | 38 +- .../resolve/cfg/propertiesAndInitBlocks.dot | 348 ++-- .../resolve/cfg/returnValuesFromLambda.dot | 200 +- .../testData/resolve/cfg/safeCalls.dot | 97 +- .../testData/resolve/cfg/simple.dot | 22 +- .../testData/resolve/cfg/tryCatch.dot | 339 ++-- .../testData/resolve/cfg/when.dot | 198 +- .../resolve/exhaustiveWhenAndDNNType.dot | 264 ++- .../testData/resolve/smartcasts/bangbang.dot | 378 ++-- .../smartcasts/booleans/booleanOperators.dot | 895 +++++---- .../smartcasts/booleans/equalsToBoolean.dot | 491 +++-- .../booleans/jumpFromRhsOfOperator.dot | 506 +++--- .../boundSmartcasts/boundSmartcasts.dot | 497 +++-- .../boundSmartcastsInBranches.dot | 831 +++++---- .../boundSmartcasts/functionCallBound.dot | 143 +- .../testData/resolve/smartcasts/casts.dot | 380 ++-- .../smartcasts/controlStructures/elvis.dot | 301 ++- .../smartcasts/controlStructures/returns.dot | 495 +++-- .../smartcasts/controlStructures/simpleIf.dot | 187 +- .../smartcastFromArgument.dot | 132 +- .../smartcasts/controlStructures/when.dot | 610 +++---- .../resolve/smartcasts/equalsAndIdentity.dot | 339 ++-- .../smartcasts/lambdas/inPlaceLambdas.dot | 205 +-- .../smartcasts/lambdas/smartcastOnLambda.dot | 45 +- .../loops/dataFlowInfoFromWhileCondition.dot | 71 +- .../resolve/smartcasts/loops/endlessLoops.dot | 615 ++++--- .../resolve/smartcasts/multipleCasts.dot | 129 +- .../resolve/smartcasts/nullability.dot | 1615 ++++++++--------- .../implicitReceiverAsWhenSubject.dot | 186 +- .../receivers/implicitReceivers.dot | 509 +++--- .../receivers/thisOfExtensionProperty.dot | 93 +- .../smartcasts/safeCalls/assignSafeCall.dot | 503 +++-- .../safeCalls/safeCallAndEqualityToBool.dot | 301 ++- .../smartcasts/safeCalls/safeCalls.dot | 289 ++- .../resolve/smartcasts/smartCastInInit.dot | 84 +- .../resolve/smartcasts/smartcastToNothing.dot | 315 ++-- .../smartcasts/stability/overridenOpenVal.dot | 137 +- .../variables/delayedAssignment.dot | 80 +- .../variables/smartcastAfterReassignment.dot | 103 +- .../contracts/callsInPlace.dot | 377 ++-- .../contracts/conditionalEffects.dot | 310 ++-- .../delegates/delegateWithAnonymousObject.dot | 245 ++- .../smartcasts/tryWithLambdaInside.dot | 171 +- 59 files changed, 8767 insertions(+), 9232 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/annotatedLocalClass.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/annotatedLocalClass.dot index ede20da077a..8a5ee80605d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/annotatedLocalClass.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/annotatedLocalClass.dot @@ -6,19 +6,17 @@ digraph annotatedLocalClass_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter class Ann" style="filled" fillcolor=red]; 4 [label="Exit class Ann" style="filled" fillcolor=red]; } - 3 -> {4} [color=green]; subgraph cluster_2 { @@ -26,70 +24,68 @@ digraph annotatedLocalClass_kt { 5 [label="Enter function foo" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 6 [label="Enter when"]; + 7 [label="Enter when"]; subgraph cluster_4 { color=blue - 7 [label="Enter when branch condition "]; - 8 [label="Access variable R|/b|"]; - 9 [label="Exit when branch condition"]; + 9 [label="Enter when branch condition "]; + 10 [label="Access variable R|/b|"]; + 11 [label="Exit when branch condition"]; } - 10 [label="Synthetic else branch"]; - 11 [label="Enter when branch result"]; + 18 [label="Synthetic else branch"]; + 12 [label="Enter when branch result"]; subgraph cluster_5 { color=blue - 12 [label="Enter block"]; - 13 [label="Jump: ^foo Unit"]; - 14 [label="Stub" style="filled" fillcolor=gray]; - 15 [label="Exit block" style="filled" fillcolor=gray]; + 13 [label="Enter block"]; + 14 [label="Jump: ^foo Unit"]; + 15 [label="Stub" style="filled" fillcolor=gray]; + 16 [label="Exit block" style="filled" fillcolor=gray]; } - 16 [label="Exit when branch result" style="filled" fillcolor=gray]; - 17 [label="Exit when"]; + 17 [label="Exit when branch result" style="filled" fillcolor=gray]; + 8 [label="Exit when"]; } subgraph cluster_6 { color=blue - 18 [label="Enter annotation"]; - 19 [label="Exit annotation"]; + 19 [label="Enter annotation"]; + 20 [label="Exit annotation"]; } - 20 [label="Exit local class foo"]; - 21 [label="Function call: R|/bar|()"]; - 22 [label="Exit function foo" style="filled" fillcolor=red]; + 21 [label="Exit local class foo"]; + 22 [label="Function call: R|/bar|()"]; + 6 [label="Exit function foo" style="filled" fillcolor=red]; } - - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; - 8 -> {9}; - 9 -> {11 10}; - 10 -> {17}; - 11 -> {12}; + 5 -> {7}; + 7 -> {9}; + 8 -> {19}; + 9 -> {10}; + 10 -> {11}; + 11 -> {12 18}; 12 -> {13}; - 13 -> {22}; - 13 -> {14} [style=dotted]; + 13 -> {14}; + 14 -> {6}; 14 -> {15} [style=dotted]; 15 -> {16} [style=dotted]; 16 -> {17} [style=dotted]; - 17 -> {18}; - 18 -> {19}; + 17 -> {8} [style=dotted]; + 18 -> {8}; 19 -> {20}; 20 -> {21}; + 20 -> {23} [color=red]; 21 -> {22}; + 22 -> {6}; subgraph cluster_7 { color=red 23 [label="Enter function " style="filled" fillcolor=red]; - 24 [label="Delegated constructor call: super()"]; - 25 [label="Exit function " style="filled" fillcolor=red]; + 25 [label="Delegated constructor call: super()"]; + 24 [label="Exit function " style="filled" fillcolor=red]; } - - 23 -> {24}; - 24 -> {25}; + 23 -> {25}; + 25 -> {24}; subgraph cluster_8 { color=red 26 [label="Enter class Local" style="filled" fillcolor=red]; 27 [label="Exit class Local" style="filled" fillcolor=red]; } - 26 -> {27} [color=green]; subgraph cluster_9 { @@ -97,7 +93,6 @@ digraph annotatedLocalClass_kt { 28 [label="Enter function bar" style="filled" fillcolor=red]; 29 [label="Exit function bar" style="filled" fillcolor=red]; } - 28 -> {29}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/binaryOperations.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/binaryOperations.dot index 490591d6875..b530ffdfa23 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/binaryOperations.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/binaryOperations.dot @@ -8,233 +8,229 @@ digraph binaryOperations_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; + 2 [label="Enter when"]; subgraph cluster_2 { color=blue - 2 [label="Enter when branch condition "]; + 4 [label="Enter when branch condition "]; subgraph cluster_3 { color=blue - 3 [label="Enter ||"]; - 4 [label="Access variable R|/b1|"]; - 5 [label="Exit left part of ||"]; - 6 [label="Enter right part of ||"]; - 7 [label="Access variable R|/b2|"]; - 8 [label="Exit ||"]; + 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 ||"]; } - 9 [label="Exit when branch condition"]; + 11 [label="Exit when branch condition"]; } - 10 [label="Synthetic else branch"]; - 11 [label="Enter when branch result"]; + 17 [label="Synthetic else branch"]; + 12 [label="Enter when branch result"]; subgraph cluster_4 { color=blue - 12 [label="Enter block"]; - 13 [label="Const: Int(1)"]; - 14 [label="Exit block"]; + 13 [label="Enter block"]; + 14 [label="Const: Int(1)"]; + 15 [label="Exit block"]; } - 15 [label="Exit when branch result"]; - 16 [label="Exit when"]; + 16 [label="Exit when branch result"]; + 3 [label="Exit when"]; } - 17 [label="Exit function test_1" style="filled" fillcolor=red]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; - 4 -> {5}; - 5 -> {8 6}; + 0 -> {2}; + 2 -> {4}; + 3 -> {1}; + 4 -> {6}; + 5 -> {11}; 6 -> {7}; 7 -> {8}; - 8 -> {9}; - 9 -> {11 10}; - 10 -> {16}; - 11 -> {12}; + 8 -> {5 9}; + 9 -> {10}; + 10 -> {5}; + 11 -> {12 17}; 12 -> {13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; - 16 -> {17}; + 16 -> {3}; + 17 -> {3}; subgraph cluster_5 { color=red 18 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 19 [label="Enter when"]; + 20 [label="Enter when"]; subgraph cluster_7 { color=blue - 20 [label="Enter when branch condition "]; + 22 [label="Enter when branch condition "]; subgraph cluster_8 { color=blue - 21 [label="Enter &&"]; - 22 [label="Access variable R|/b1|"]; - 23 [label="Exit left part of &&"]; - 24 [label="Enter right part of &&"]; - 25 [label="Access variable R|/b2|"]; - 26 [label="Exit &&"]; + 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 &&"]; } - 27 [label="Exit when branch condition"]; + 29 [label="Exit when branch condition"]; } - 28 [label="Synthetic else branch"]; - 29 [label="Enter when branch result"]; + 35 [label="Synthetic else branch"]; + 30 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 30 [label="Enter block"]; - 31 [label="Const: Int(1)"]; - 32 [label="Exit block"]; + 31 [label="Enter block"]; + 32 [label="Const: Int(1)"]; + 33 [label="Exit block"]; } - 33 [label="Exit when branch result"]; - 34 [label="Exit when"]; + 34 [label="Exit when branch result"]; + 21 [label="Exit when"]; } - 35 [label="Exit function test_2" style="filled" fillcolor=red]; + 19 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 18 -> {19}; - 19 -> {20}; - 20 -> {21}; - 21 -> {22}; - 22 -> {23}; - 23 -> {26 24}; + 18 -> {20}; + 20 -> {22}; + 21 -> {19}; + 22 -> {24}; + 23 -> {29}; 24 -> {25}; 25 -> {26}; - 26 -> {27}; - 27 -> {29 28}; - 28 -> {34}; - 29 -> {30}; + 26 -> {23 27}; + 27 -> {28}; + 28 -> {23}; + 29 -> {30 35}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {35}; + 34 -> {21}; + 35 -> {21}; subgraph cluster_10 { color=red 36 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_11 { color=blue - 37 [label="Enter when"]; + 38 [label="Enter when"]; subgraph cluster_12 { color=blue - 38 [label="Enter when branch condition "]; + 40 [label="Enter when branch condition "]; subgraph cluster_13 { color=blue - 39 [label="Enter ||"]; + 42 [label="Enter ||"]; subgraph cluster_14 { color=blue - 40 [label="Enter &&"]; - 41 [label="Access variable R|/b1|"]; - 42 [label="Exit left part of &&"]; - 43 [label="Enter right part of &&"]; - 44 [label="Access variable R|/b2|"]; - 45 [label="Exit &&"]; + 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 &&"]; } - 46 [label="Exit left part of ||"]; - 47 [label="Enter right part of ||"]; - 48 [label="Access variable R|/b3|"]; - 49 [label="Exit ||"]; + 49 [label="Exit left part of ||"]; + 50 [label="Enter right part of ||"]; + 51 [label="Access variable R|/b3|"]; + 41 [label="Exit ||"]; } - 50 [label="Exit when branch condition"]; + 52 [label="Exit when branch condition"]; } - 51 [label="Synthetic else branch"]; - 52 [label="Enter when branch result"]; + 58 [label="Synthetic else branch"]; + 53 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 53 [label="Enter block"]; - 54 [label="Const: Int(1)"]; - 55 [label="Exit block"]; + 54 [label="Enter block"]; + 55 [label="Const: Int(1)"]; + 56 [label="Exit block"]; } - 56 [label="Exit when branch result"]; - 57 [label="Exit when"]; + 57 [label="Exit when branch result"]; + 39 [label="Exit when"]; } - 58 [label="Exit function test_3" style="filled" fillcolor=red]; + 37 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 36 -> {37}; - 37 -> {38}; - 38 -> {39}; - 39 -> {40}; - 40 -> {41}; - 41 -> {42}; - 42 -> {45 43}; - 43 -> {44}; + 36 -> {38}; + 38 -> {40}; + 39 -> {37}; + 40 -> {42}; + 41 -> {52}; + 42 -> {44}; + 43 -> {49}; 44 -> {45}; 45 -> {46}; - 46 -> {49 47}; + 46 -> {43 47}; 47 -> {48}; - 48 -> {49}; - 49 -> {50}; - 50 -> {52 51}; - 51 -> {57}; - 52 -> {53}; + 48 -> {43}; + 49 -> {41 50}; + 50 -> {51}; + 51 -> {41}; + 52 -> {53 58}; 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {58}; + 57 -> {39}; + 58 -> {39}; subgraph cluster_16 { color=red 59 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_17 { color=blue - 60 [label="Enter when"]; + 61 [label="Enter when"]; subgraph cluster_18 { color=blue - 61 [label="Enter when branch condition "]; + 63 [label="Enter when branch condition "]; subgraph cluster_19 { color=blue - 62 [label="Enter ||"]; - 63 [label="Access variable R|/b1|"]; - 64 [label="Exit left part of ||"]; - 65 [label="Enter right part of ||"]; + 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 - 66 [label="Enter &&"]; - 67 [label="Access variable R|/b2|"]; - 68 [label="Exit left part of &&"]; - 69 [label="Enter right part of &&"]; - 70 [label="Access variable R|/b3|"]; - 71 [label="Exit &&"]; + 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 &&"]; } - 72 [label="Exit ||"]; + 64 [label="Exit ||"]; } - 73 [label="Exit when branch condition"]; + 75 [label="Exit when branch condition"]; } - 74 [label="Synthetic else branch"]; - 75 [label="Enter when branch result"]; + 81 [label="Synthetic else branch"]; + 76 [label="Enter when branch result"]; subgraph cluster_21 { color=blue - 76 [label="Enter block"]; - 77 [label="Const: Int(1)"]; - 78 [label="Exit block"]; + 77 [label="Enter block"]; + 78 [label="Const: Int(1)"]; + 79 [label="Exit block"]; } - 79 [label="Exit when branch result"]; - 80 [label="Exit when"]; + 80 [label="Exit when branch result"]; + 62 [label="Exit when"]; } - 81 [label="Exit function test_4" style="filled" fillcolor=red]; + 60 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 59 -> {60}; - 60 -> {61}; - 61 -> {62}; - 62 -> {63}; - 63 -> {64}; - 64 -> {72 65}; + 59 -> {61}; + 61 -> {63}; + 62 -> {60}; + 63 -> {65}; + 64 -> {75}; 65 -> {66}; 66 -> {67}; - 67 -> {68}; - 68 -> {71 69}; - 69 -> {70}; + 67 -> {64 68}; + 68 -> {70}; + 69 -> {64}; 70 -> {71}; 71 -> {72}; - 72 -> {73}; - 73 -> {75 74}; - 74 -> {80}; - 75 -> {76}; + 72 -> {69 73}; + 73 -> {74}; + 74 -> {69}; + 75 -> {76 81}; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; - 80 -> {81}; + 80 -> {62}; + 81 -> {62}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/booleanOperatorsWithConsts.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/booleanOperatorsWithConsts.dot index 47d71dcb965..325c8269f17 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/booleanOperatorsWithConsts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/booleanOperatorsWithConsts.dot @@ -8,419 +8,411 @@ digraph booleanOperatorsWithConsts_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; + 2 [label="Enter when"]; subgraph cluster_2 { color=blue - 2 [label="Enter when branch condition "]; + 4 [label="Enter when branch condition "]; subgraph cluster_3 { color=blue - 3 [label="Enter ||"]; - 4 [label="Access variable R|/b|"]; - 5 [label="Exit left part of ||"]; - 6 [label="Enter right part of ||"]; - 7 [label="Const: Boolean(false)"]; - 8 [label="Exit ||"]; + 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 ||"]; } - 9 [label="Exit when branch condition"]; + 11 [label="Exit when branch condition"]; } - 10 [label="Synthetic else branch"]; - 11 [label="Enter when branch result"]; + 17 [label="Synthetic else branch"]; + 12 [label="Enter when branch result"]; subgraph cluster_4 { color=blue - 12 [label="Enter block"]; - 13 [label="Const: Int(1)"]; - 14 [label="Exit block"]; + 13 [label="Enter block"]; + 14 [label="Const: Int(1)"]; + 15 [label="Exit block"]; } - 15 [label="Exit when branch result"]; - 16 [label="Exit when"]; + 16 [label="Exit when branch result"]; + 3 [label="Exit when"]; } - 17 [label="Exit function test_1" style="filled" fillcolor=red]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; - 4 -> {5}; - 5 -> {8 6}; + 0 -> {2}; + 2 -> {4}; + 3 -> {1}; + 4 -> {6}; + 5 -> {11}; 6 -> {7}; 7 -> {8}; - 8 -> {9}; - 9 -> {11 10}; - 10 -> {16}; - 11 -> {12}; + 8 -> {5 9}; + 9 -> {10}; + 10 -> {5}; + 11 -> {12 17}; 12 -> {13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; - 16 -> {17}; + 16 -> {3}; + 17 -> {3}; subgraph cluster_5 { color=red 18 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 19 [label="Enter when"]; + 20 [label="Enter when"]; subgraph cluster_7 { color=blue - 20 [label="Enter when branch condition "]; + 22 [label="Enter when branch condition "]; subgraph cluster_8 { color=blue - 21 [label="Enter ||"]; - 22 [label="Const: Boolean(false)"]; - 23 [label="Exit left part of ||"]; - 24 [label="Enter right part of ||"]; - 25 [label="Access variable R|/b|"]; - 26 [label="Exit ||"]; + 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 ||"]; } - 27 [label="Exit when branch condition"]; + 29 [label="Exit when branch condition"]; } - 28 [label="Synthetic else branch"]; - 29 [label="Enter when branch result"]; + 35 [label="Synthetic else branch"]; + 30 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 30 [label="Enter block"]; - 31 [label="Const: Int(1)"]; - 32 [label="Exit block"]; + 31 [label="Enter block"]; + 32 [label="Const: Int(1)"]; + 33 [label="Exit block"]; } - 33 [label="Exit when branch result"]; - 34 [label="Exit when"]; + 34 [label="Exit when branch result"]; + 21 [label="Exit when"]; } - 35 [label="Exit function test_2" style="filled" fillcolor=red]; + 19 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 18 -> {19}; - 19 -> {20}; - 20 -> {21}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; - 23 -> {26} [style=dotted]; + 18 -> {20}; + 20 -> {22}; + 21 -> {19}; + 22 -> {24}; + 23 -> {29}; 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {29 28}; - 28 -> {34}; - 29 -> {30}; + 26 -> {23} [style=dotted]; + 27 -> {28}; + 28 -> {23}; + 29 -> {30 35}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {35}; + 34 -> {21}; + 35 -> {21}; subgraph cluster_10 { color=red 36 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_11 { color=blue - 37 [label="Enter when"]; + 38 [label="Enter when"]; subgraph cluster_12 { color=blue - 38 [label="Enter when branch condition "]; + 40 [label="Enter when branch condition "]; subgraph cluster_13 { color=blue - 39 [label="Enter ||"]; - 40 [label="Access variable R|/b|"]; - 41 [label="Exit left part of ||"]; - 42 [label="Enter right part of ||"]; - 43 [label="Const: Boolean(true)"]; - 44 [label="Exit ||"]; + 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 ||"]; } - 45 [label="Exit when branch condition"]; + 47 [label="Exit when branch condition"]; } - 46 [label="Synthetic else branch"]; - 47 [label="Enter when branch result"]; + 53 [label="Synthetic else branch"]; + 48 [label="Enter when branch result"]; subgraph cluster_14 { color=blue - 48 [label="Enter block"]; - 49 [label="Const: Int(1)"]; - 50 [label="Exit block"]; + 49 [label="Enter block"]; + 50 [label="Const: Int(1)"]; + 51 [label="Exit block"]; } - 51 [label="Exit when branch result"]; - 52 [label="Exit when"]; + 52 [label="Exit when branch result"]; + 39 [label="Exit when"]; } - 53 [label="Exit function test_3" style="filled" fillcolor=red]; + 37 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 36 -> {37}; - 37 -> {38}; - 38 -> {39}; - 39 -> {40}; - 40 -> {41}; - 41 -> {44 42}; + 36 -> {38}; + 38 -> {40}; + 39 -> {37}; + 40 -> {42}; + 41 -> {47}; 42 -> {43}; 43 -> {44}; - 44 -> {45}; - 45 -> {47 46}; - 46 -> {52}; - 47 -> {48}; + 44 -> {41 45}; + 45 -> {46}; + 46 -> {41}; + 47 -> {48 53}; 48 -> {49}; 49 -> {50}; 50 -> {51}; 51 -> {52}; - 52 -> {53}; + 52 -> {39}; + 53 -> {39}; subgraph cluster_15 { color=red 54 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_16 { color=blue - 55 [label="Enter when"]; + 56 [label="Enter when"]; subgraph cluster_17 { color=blue - 56 [label="Enter when branch condition "]; + 58 [label="Enter when branch condition "]; subgraph cluster_18 { color=blue - 57 [label="Enter ||"]; - 58 [label="Const: Boolean(true)"]; - 59 [label="Exit left part of ||"]; - 60 [label="Enter right part of ||" style="filled" fillcolor=gray]; - 61 [label="Access variable R|/b|" style="filled" fillcolor=gray]; - 62 [label="Exit ||"]; + 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 ||"]; } - 63 [label="Exit when branch condition"]; + 65 [label="Exit when branch condition"]; } - 64 [label="Synthetic else branch"]; - 65 [label="Enter when branch result"]; + 71 [label="Synthetic else branch"]; + 66 [label="Enter when branch result"]; subgraph cluster_19 { color=blue - 66 [label="Enter block"]; - 67 [label="Const: Int(1)"]; - 68 [label="Exit block"]; + 67 [label="Enter block"]; + 68 [label="Const: Int(1)"]; + 69 [label="Exit block"]; } - 69 [label="Exit when branch result"]; - 70 [label="Exit when"]; + 70 [label="Exit when branch result"]; + 57 [label="Exit when"]; } - 71 [label="Exit function test_4" style="filled" fillcolor=red]; + 55 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 54 -> {55}; - 55 -> {56}; - 56 -> {57}; - 57 -> {58}; - 58 -> {59}; - 59 -> {62}; - 59 -> {60} [style=dotted]; - 60 -> {61} [style=dotted]; - 61 -> {62} [style=dotted]; - 62 -> {63}; - 63 -> {65 64}; - 64 -> {70}; - 65 -> {66}; + 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 -> {71}; + 70 -> {57}; + 71 -> {57}; subgraph cluster_20 { color=red 72 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_21 { color=blue - 73 [label="Enter when"]; + 74 [label="Enter when"]; subgraph cluster_22 { color=blue - 74 [label="Enter when branch condition "]; + 76 [label="Enter when branch condition "]; subgraph cluster_23 { color=blue - 75 [label="Enter &&"]; - 76 [label="Access variable R|/b|"]; - 77 [label="Exit left part of &&"]; - 78 [label="Enter right part of &&"]; - 79 [label="Const: Boolean(false)"]; - 80 [label="Exit &&"]; + 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 &&"]; } - 81 [label="Exit when branch condition"]; + 83 [label="Exit when branch condition"]; } - 82 [label="Synthetic else branch"]; - 83 [label="Enter when branch result"]; + 89 [label="Synthetic else branch"]; + 84 [label="Enter when branch result"]; subgraph cluster_24 { color=blue - 84 [label="Enter block"]; - 85 [label="Const: Int(1)"]; - 86 [label="Exit block"]; + 85 [label="Enter block"]; + 86 [label="Const: Int(1)"]; + 87 [label="Exit block"]; } - 87 [label="Exit when branch result"]; - 88 [label="Exit when"]; + 88 [label="Exit when branch result"]; + 75 [label="Exit when"]; } - 89 [label="Exit function test_5" style="filled" fillcolor=red]; + 73 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 72 -> {73}; - 73 -> {74}; - 74 -> {75}; - 75 -> {76}; - 76 -> {77}; - 77 -> {80 78}; + 72 -> {74}; + 74 -> {76}; + 75 -> {73}; + 76 -> {78}; + 77 -> {83}; 78 -> {79}; 79 -> {80}; - 80 -> {81}; - 81 -> {83 82}; - 82 -> {88}; - 83 -> {84}; + 80 -> {77 81}; + 81 -> {82}; + 82 -> {77}; + 83 -> {84 89}; 84 -> {85}; 85 -> {86}; 86 -> {87}; 87 -> {88}; - 88 -> {89}; + 88 -> {75}; + 89 -> {75}; subgraph cluster_25 { color=red 90 [label="Enter function test_6" style="filled" fillcolor=red]; subgraph cluster_26 { color=blue - 91 [label="Enter when"]; + 92 [label="Enter when"]; subgraph cluster_27 { color=blue - 92 [label="Enter when branch condition "]; + 94 [label="Enter when branch condition "]; subgraph cluster_28 { color=blue - 93 [label="Enter &&"]; - 94 [label="Const: Boolean(false)"]; - 95 [label="Exit left part of &&"]; - 96 [label="Enter right part of &&" style="filled" fillcolor=gray]; - 97 [label="Access variable R|/b|" style="filled" fillcolor=gray]; - 98 [label="Exit &&"]; + 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 &&"]; } - 99 [label="Exit when branch condition"]; + 101 [label="Exit when branch condition"]; } - 100 [label="Synthetic else branch"]; - 101 [label="Enter when branch result"]; + 107 [label="Synthetic else branch"]; + 102 [label="Enter when branch result"]; subgraph cluster_29 { color=blue - 102 [label="Enter block"]; - 103 [label="Const: Int(1)"]; - 104 [label="Exit block"]; + 103 [label="Enter block"]; + 104 [label="Const: Int(1)"]; + 105 [label="Exit block"]; } - 105 [label="Exit when branch result"]; - 106 [label="Exit when"]; + 106 [label="Exit when branch result"]; + 93 [label="Exit when"]; } - 107 [label="Exit function test_6" style="filled" fillcolor=red]; + 91 [label="Exit function test_6" style="filled" fillcolor=red]; } - - 90 -> {91}; - 91 -> {92}; - 92 -> {93}; - 93 -> {94}; - 94 -> {95}; - 95 -> {98}; - 95 -> {96} [style=dotted]; - 96 -> {97} [style=dotted]; - 97 -> {98} [style=dotted]; - 98 -> {99}; - 99 -> {101 100}; - 100 -> {106}; - 101 -> {102}; + 90 -> {92}; + 92 -> {94}; + 93 -> {91}; + 94 -> {96}; + 95 -> {101}; + 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 -> {107}; + 106 -> {93}; + 107 -> {93}; subgraph cluster_30 { color=red 108 [label="Enter function test_7" style="filled" fillcolor=red]; subgraph cluster_31 { color=blue - 109 [label="Enter when"]; + 110 [label="Enter when"]; subgraph cluster_32 { color=blue - 110 [label="Enter when branch condition "]; + 112 [label="Enter when branch condition "]; subgraph cluster_33 { color=blue - 111 [label="Enter &&"]; - 112 [label="Access variable R|/b|"]; - 113 [label="Exit left part of &&"]; - 114 [label="Enter right part of &&"]; - 115 [label="Const: Boolean(true)"]; - 116 [label="Exit &&"]; + 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 &&"]; } - 117 [label="Exit when branch condition"]; + 119 [label="Exit when branch condition"]; } - 118 [label="Synthetic else branch"]; - 119 [label="Enter when branch result"]; + 125 [label="Synthetic else branch"]; + 120 [label="Enter when branch result"]; subgraph cluster_34 { color=blue - 120 [label="Enter block"]; - 121 [label="Const: Int(1)"]; - 122 [label="Exit block"]; + 121 [label="Enter block"]; + 122 [label="Const: Int(1)"]; + 123 [label="Exit block"]; } - 123 [label="Exit when branch result"]; - 124 [label="Exit when"]; + 124 [label="Exit when branch result"]; + 111 [label="Exit when"]; } - 125 [label="Exit function test_7" style="filled" fillcolor=red]; + 109 [label="Exit function test_7" style="filled" fillcolor=red]; } - - 108 -> {109}; - 109 -> {110}; - 110 -> {111}; - 111 -> {112}; - 112 -> {113}; - 113 -> {116 114}; + 108 -> {110}; + 110 -> {112}; + 111 -> {109}; + 112 -> {114}; + 113 -> {119}; 114 -> {115}; 115 -> {116}; - 116 -> {117}; - 117 -> {119 118}; - 118 -> {124}; - 119 -> {120}; + 116 -> {113 117}; + 117 -> {118}; + 118 -> {113}; + 119 -> {120 125}; 120 -> {121}; 121 -> {122}; 122 -> {123}; 123 -> {124}; - 124 -> {125}; + 124 -> {111}; + 125 -> {111}; subgraph cluster_35 { color=red 126 [label="Enter function test_8" style="filled" fillcolor=red]; subgraph cluster_36 { color=blue - 127 [label="Enter when"]; + 128 [label="Enter when"]; subgraph cluster_37 { color=blue - 128 [label="Enter when branch condition "]; + 130 [label="Enter when branch condition "]; subgraph cluster_38 { color=blue - 129 [label="Enter &&"]; - 130 [label="Const: Boolean(true)"]; - 131 [label="Exit left part of &&"]; - 132 [label="Enter right part of &&"]; - 133 [label="Access variable R|/b|"]; - 134 [label="Exit &&"]; + 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 &&"]; } - 135 [label="Exit when branch condition"]; + 137 [label="Exit when branch condition"]; } - 136 [label="Synthetic else branch"]; - 137 [label="Enter when branch result"]; + 143 [label="Synthetic else branch"]; + 138 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 138 [label="Enter block"]; - 139 [label="Const: Int(1)"]; - 140 [label="Exit block"]; + 139 [label="Enter block"]; + 140 [label="Const: Int(1)"]; + 141 [label="Exit block"]; } - 141 [label="Exit when branch result"]; - 142 [label="Exit when"]; + 142 [label="Exit when branch result"]; + 129 [label="Exit when"]; } - 143 [label="Exit function test_8" style="filled" fillcolor=red]; + 127 [label="Exit function test_8" style="filled" fillcolor=red]; } - - 126 -> {127}; - 127 -> {128}; - 128 -> {129}; - 129 -> {130}; - 130 -> {131}; - 131 -> {132}; - 131 -> {134} [style=dotted]; + 126 -> {128}; + 128 -> {130}; + 129 -> {127}; + 130 -> {132}; + 131 -> {137}; 132 -> {133}; 133 -> {134}; 134 -> {135}; - 135 -> {137 136}; - 136 -> {142}; - 137 -> {138}; + 134 -> {131} [style=dotted]; + 135 -> {136}; + 136 -> {131}; + 137 -> {138 143}; 138 -> {139}; 139 -> {140}; 140 -> {141}; 141 -> {142}; - 142 -> {143}; + 142 -> {129}; + 143 -> {129}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot index a640b6c890d..09b24ca4075 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot @@ -8,7 +8,6 @@ digraph complex_kt { 0 [label="Enter function close" style="filled" fillcolor=red]; 1 [label="Exit function close" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph complex_kt { 2 [label="Enter class AutoCloseable" style="filled" fillcolor=red]; 3 [label="Exit class AutoCloseable" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph complex_kt { 4 [label="Enter function addSuppressed" style="filled" fillcolor=red]; 5 [label="Exit function addSuppressed" style="filled" fillcolor=red]; } - 4 -> {5}; subgraph cluster_3 { @@ -32,82 +29,82 @@ digraph complex_kt { 6 [label="Enter function closeFinally" style="filled" fillcolor=red]; subgraph cluster_4 { color=blue - 7 [label="Enter when"]; + 8 [label="Enter when"]; subgraph cluster_5 { color=blue - 8 [label="Enter when branch condition "]; - 9 [label="Access variable this@R|/closeFinally|"]; - 10 [label="Const: Null(null)"]; - 11 [label="Operator =="]; - 12 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_6 { color=blue - 13 [label="Enter when branch condition "]; - 14 [label="Access variable R|/cause|"]; - 15 [label="Const: Null(null)"]; - 16 [label="Operator =="]; - 17 [label="Exit when branch condition"]; + 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 - 18 [label="Enter when branch condition else"]; - 19 [label="Exit when branch condition"]; + 29 [label="Enter when branch condition else"]; + 30 [label="Exit when branch condition"]; } - 20 [label="Enter when branch result"]; + 31 [label="Enter when branch result"]; subgraph cluster_8 { color=blue - 21 [label="Enter block"]; + 32 [label="Enter block"]; subgraph cluster_9 { color=blue - 22 [label="Try expression enter"]; + 33 [label="Try expression enter"]; subgraph cluster_10 { color=blue - 23 [label="Try main block enter"]; + 35 [label="Try main block enter"]; subgraph cluster_11 { color=blue - 24 [label="Enter block"]; - 25 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; - 26 [label="Exit block"]; + 37 [label="Enter block"]; + 38 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; + 39 [label="Exit block"]; } - 27 [label="Try main block exit"]; + 40 [label="Try main block exit"]; } subgraph cluster_12 { color=blue - 28 [label="Catch enter"]; + 36 [label="Catch enter"]; subgraph cluster_13 { color=blue - 29 [label="Enter block"]; - 30 [label="Access variable R|/cause|"]; - 31 [label="Access variable R|/closeException|"]; - 32 [label="Function call: R|/cause|.R|/addSuppressed|(...)"]; - 33 [label="Exit block"]; + 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"]; } - 34 [label="Catch exit"]; + 46 [label="Catch exit"]; } - 35 [label="Try expression exit"]; + 34 [label="Try expression exit"]; } - 36 [label="Exit block"]; + 47 [label="Exit block"]; } - 37 [label="Exit when branch result"]; - 38 [label="Enter when branch result"]; + 48 [label="Exit when branch result"]; + 24 [label="Enter when branch result"]; subgraph cluster_14 { color=blue - 39 [label="Enter block"]; - 40 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; - 41 [label="Exit block"]; + 25 [label="Enter block"]; + 26 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; + 27 [label="Exit block"]; } - 42 [label="Exit when branch result"]; - 43 [label="Enter when branch result"]; + 28 [label="Exit when branch result"]; + 15 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 44 [label="Enter block"]; - 45 [label="Exit block"]; + 16 [label="Enter block"]; + 17 [label="Exit block"]; } - 46 [label="Exit when branch result"]; - 47 [label="Exit when"]; + 18 [label="Exit when branch result"]; + 9 [label="Exit when"]; } - 48 [label="Jump: ^closeFinally when () { + 49 [label="Jump: ^closeFinally when () { ==(this@R|/closeFinally|, Null(null)) -> { } ==(R|/cause|, Null(null)) -> { @@ -124,151 +121,149 @@ digraph complex_kt { } } "]; - 49 [label="Stub" style="filled" fillcolor=gray]; - 50 [label="Exit function closeFinally" style="filled" fillcolor=red]; + 50 [label="Stub" style="filled" fillcolor=gray]; + 7 [label="Exit function closeFinally" style="filled" fillcolor=red]; } - - 6 -> {7}; - 7 -> {8}; - 8 -> {9}; - 9 -> {10}; + 6 -> {8}; + 8 -> {10}; + 9 -> {49}; 10 -> {11}; 11 -> {12}; - 12 -> {43 13}; + 12 -> {13}; 13 -> {14}; - 14 -> {15}; + 14 -> {15 19}; 15 -> {16}; 16 -> {17}; - 17 -> {38 18}; - 18 -> {19}; + 17 -> {18}; + 18 -> {9}; 19 -> {20}; 20 -> {21}; 21 -> {22}; 22 -> {23}; - 23 -> {50 28 24}; + 23 -> {24 29}; 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {35}; - 28 -> {50 29}; + 27 -> {28}; + 28 -> {9}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; - 33 -> {34}; - 34 -> {35}; - 35 -> {36}; - 36 -> {37}; - 37 -> {47}; + 33 -> {35}; + 34 -> {47}; + 35 -> {7 36 37}; + 36 -> {7 41}; + 37 -> {38}; 38 -> {39}; 39 -> {40}; - 40 -> {41}; + 40 -> {34}; 41 -> {42}; - 42 -> {47}; + 42 -> {43}; 43 -> {44}; 44 -> {45}; 45 -> {46}; - 46 -> {47}; + 46 -> {34}; 47 -> {48}; - 48 -> {50}; - 48 -> {49} [style=dotted]; + 48 -> {9}; + 49 -> {7}; 49 -> {50} [style=dotted]; + 50 -> {7} [style=dotted]; subgraph cluster_16 { color=red 51 [label="Enter function firstIsInstanceOrNull" style="filled" fillcolor=red]; - 52 [label="Access variable this@R|/firstIsInstanceOrNull|"]; - 53 [label="Function call: this@R|/firstIsInstanceOrNull|.R|FakeOverride|>|()"]; - 54 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + 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 { color=blue - 55 [label="Enter while loop"]; + 56 [label="Enter while loop"]; subgraph cluster_18 { 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"]; + 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 - 60 [label="Enter loop block"]; + 62 [label="Enter loop block"]; subgraph cluster_20 { color=blue - 61 [label="Enter block"]; - 62 [label="Access variable R|/|"]; - 63 [label="Function call: R|/|.R|FakeOverride|()"]; - 64 [label="Variable declaration: lval element: R|kotlin/Any?|"]; + 63 [label="Enter block"]; + 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 - 65 [label="Enter when"]; + 67 [label="Enter when"]; subgraph cluster_22 { color=blue - 66 [label="Enter when branch condition "]; - 67 [label="Access variable R|/element|"]; - 68 [label="Type operator: (R|/element| is R|T|)"]; - 69 [label="Exit when branch condition"]; + 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"]; } - 70 [label="Synthetic else branch"]; - 71 [label="Enter when branch result"]; + 80 [label="Synthetic else branch"]; + 73 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 72 [label="Enter block"]; - 73 [label="Access variable R|/element|"]; - 74 [label="Jump: ^firstIsInstanceOrNull R|/element|"]; - 75 [label="Stub" style="filled" fillcolor=gray]; - 76 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 77 [label="Exit when branch result" style="filled" fillcolor=gray]; - 78 [label="Exit when"]; + 79 [label="Exit when branch result" style="filled" fillcolor=gray]; + 68 [label="Exit when"]; } - 79 [label="Exit block"]; + 81 [label="Exit block"]; } - 80 [label="Exit loop block"]; + 82 [label="Exit loop block"]; } - 81 [label="Exit whileloop"]; + 57 [label="Exit whileloop"]; } - 82 [label="Const: Null(null)"]; - 83 [label="Jump: ^firstIsInstanceOrNull Null(null)"]; - 84 [label="Stub" style="filled" fillcolor=gray]; - 85 [label="Exit function firstIsInstanceOrNull" style="filled" fillcolor=red]; + 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]; } - - 51 -> {52}; - 52 -> {53}; + 51 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; - 56 -> {57}; - 57 -> {58}; + 56 -> {58}; + 57 -> {83}; 58 -> {59}; - 59 -> {81 60}; + 59 -> {60}; 60 -> {61}; - 61 -> {62}; + 61 -> {57 62}; 62 -> {63}; 63 -> {64}; 64 -> {65}; 65 -> {66}; 66 -> {67}; - 67 -> {68}; - 68 -> {69}; - 69 -> {71 70}; - 70 -> {78}; + 67 -> {69}; + 68 -> {81}; + 69 -> {70}; + 70 -> {71}; 71 -> {72}; - 72 -> {73}; + 72 -> {73 80}; 73 -> {74}; - 74 -> {85}; - 74 -> {75} [style=dotted]; - 75 -> {76} [style=dotted]; + 74 -> {75}; + 75 -> {76}; + 76 -> {52}; 76 -> {77} [style=dotted]; 77 -> {78} [style=dotted]; - 78 -> {79}; - 79 -> {80}; - 80 -> {56}; + 78 -> {79} [style=dotted]; + 79 -> {68} [style=dotted]; + 80 -> {68}; 81 -> {82}; - 82 -> {83}; - 83 -> {85}; - 83 -> {84} [style=dotted]; + 82 -> {58}; + 83 -> {84}; + 84 -> {52}; 84 -> {85} [style=dotted]; + 85 -> {52} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.dot index 613bd010684..80847240a8b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.dot @@ -8,56 +8,53 @@ digraph emptyWhen_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; - 2 [label="Synthetic else branch"]; + 2 [label="Enter when"]; + 4 [label="Synthetic else branch"]; 3 [label="Exit when"]; } - 4 [label="Exit function test_1" style="filled" fillcolor=red]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; + 0 -> {2}; + 2 -> {4}; + 3 -> {1}; + 4 -> {3}; subgraph cluster_2 { color=red 5 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 6 [label="Enter when"]; - 7 [label="Access variable R|/x|"]; - 8 [label="Synthetic else branch"]; - 9 [label="Exit when"]; + 7 [label="Enter when"]; + 9 [label="Access variable R|/x|"]; + 10 [label="Synthetic else branch"]; + 8 [label="Exit when"]; } - 10 [label="Exit function test_2" style="filled" fillcolor=red]; + 6 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; - 8 -> {9}; + 5 -> {7}; + 7 -> {9}; + 8 -> {6}; 9 -> {10}; + 10 -> {8}; subgraph cluster_4 { color=red 11 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 12 [label="Enter when"]; - 13 [label="Access variable R|/x|"]; - 14 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 15 [label="Synthetic else branch"]; - 16 [label="Exit when"]; + 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="Exit function test_3" style="filled" fillcolor=red]; + 12 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 11 -> {12}; - 12 -> {13}; - 13 -> {14}; - 14 -> {15}; + 11 -> {13}; + 13 -> {15}; + 14 -> {12}; 15 -> {16}; 16 -> {17}; + 17 -> {14}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot index 97877ba6141..ce3294f98b1 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot @@ -8,306 +8,317 @@ digraph flowFromInplaceLambda_kt { 0 [label="Enter function takeInt" style="filled" fillcolor=red]; 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]; - 3 [label="Access variable R|/x|"]; - 4 [label="Const: Int(0)"]; - 5 [label="Function call: R|/x|.R|FakeOverride|(...)"]; - 6 [label="Jump: ^select R|/x|.R|FakeOverride|(Int(0))"]; - 7 [label="Stub" style="filled" fillcolor=gray]; - 8 [label="Exit 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 -> {3}; - 3 -> {4}; + 2 -> {4}; 4 -> {5}; 5 -> {6}; - 6 -> {8}; - 6 -> {7} [style=dotted]; + 6 -> {7}; + 7 -> {3}; 7 -> {8} [style=dotted]; + 8 -> {3} [style=dotted]; subgraph cluster_2 { color=red 9 [label="Enter function id" style="filled" fillcolor=red]; - 10 [label="Access variable R|/x|"]; - 11 [label="Jump: ^id R|/x|"]; - 12 [label="Stub" style="filled" fillcolor=gray]; - 13 [label="Exit 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]; } - - 9 -> {10}; - 10 -> {11}; - 11 -> {13}; - 11 -> {12} [style=dotted]; + 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]; - 15 [label="Const: Null(null)"]; - 16 [label="Check not null: Null(null)!!"]; - 17 [label="Jump: ^materialize Null(null)!!"]; - 18 [label="Stub" style="filled" fillcolor=gray]; - 19 [label="Exit 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 -> {15}; - 15 -> {16}; + 14 -> {16}; 16 -> {17}; - 17 -> {19}; - 17 -> {18} [style=dotted]; + 17 -> {18}; + 18 -> {15}; 18 -> {19} [style=dotted]; + 19 -> {15} [style=dotted]; subgraph cluster_4 { color=red 20 [label="Enter function myRun" style="filled" fillcolor=red]; - 21 [label="Function call: R|/block|.R|FakeOverride|()"]; - 22 [label="Jump: ^myRun R|/block|.R|FakeOverride|()"]; - 23 [label="Stub" style="filled" fillcolor=gray]; - 24 [label="Exit 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]; } - - 20 -> {21}; - 21 -> {22}; - 22 -> {24}; - 22 -> {23} [style=dotted]; + 20 -> {22}; + 22 -> {23}; + 23 -> {21}; 23 -> {24} [style=dotted]; + 24 -> {21} [style=dotted]; subgraph cluster_5 { color=red 25 [label="Enter function test_1" style="filled" fillcolor=red]; - 26 [label="Postponed enter to lambda"]; + 27 [label="Postponed enter to lambda"]; subgraph cluster_6 { color=blue - 27 [label="Enter function anonymousFunction"]; - 28 [label="Access variable R|/x|"]; - 29 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 29 [label="Enter function anonymousFunction"]; + 31 [label="Access variable R|/x|"]; + 32 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; 30 [label="Exit function anonymousFunction"]; } - 31 [label="Call arguments union" style="filled" fillcolor=yellow]; - 32 [label="Postponed exit from lambda"]; + 34 [label="Call arguments union" style="filled" fillcolor=yellow]; + 28 [label="Postponed exit from lambda"]; 33 [label="Function call: R|kotlin/run|(...)"]; - 34 [label="Access variable R|/x|"]; - 35 [label="Function call: R|/takeInt|(...)"]; - 36 [label="Exit function test_1" style="filled" fillcolor=red]; + 35 [label="Access variable R|/x|"]; + 36 [label="Function call: R|/takeInt|(...)"]; + 26 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 25 -> {26}; - 26 -> {27}; - 26 -> {32} [color=red]; - 27 -> {28}; - 28 -> {29}; - 29 -> {30}; - 30 -> {32} [color=green]; - 30 -> {31} [color=red]; - 31 -> {33} [color=red]; - 32 -> {33} [color=green]; - 33 -> {34}; - 34 -> {35}; + 25 -> {27}; + 27 -> {29}; + 27 -> {28} [color=red]; + 28 -> {33} [color=green]; + 29 -> {31}; + 30 -> {28} [color=green]; + 30 -> {34} [color=red]; + 31 -> {32}; + 32 -> {30}; + 33 -> {35}; + 34 -> {33} [color=red]; 35 -> {36}; + 36 -> {26}; subgraph cluster_7 { color=red 37 [label="Enter function test_2" style="filled" fillcolor=red]; - 38 [label="Postponed enter to lambda"]; + 39 [label="Postponed enter to lambda"]; subgraph cluster_8 { color=blue - 39 [label="Enter function anonymousFunction"]; - 40 [label="Access variable R|/y|"]; - 41 [label="Function call: R|/y|.#()"]; - 42 [label="Access variable R|/x|"]; - 43 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 44 [label="Exit function anonymousFunction"]; + 41 [label="Enter function anonymousFunction"]; + 43 [label="Access variable R|/y|"]; + 44 [label="Function call: R|/y|.#()"]; + 45 [label="Access variable R|/x|"]; + 46 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 42 [label="Exit function anonymousFunction"]; } - 45 [label="Postponed exit from lambda"]; - 46 [label="Function call: R|kotlin/run|(...)"]; - 47 [label="Call arguments union" style="filled" fillcolor=yellow]; + 40 [label="Postponed exit from lambda"]; + 47 [label="Function call: R|kotlin/run|(...)"]; + 49 [label="Call arguments union" style="filled" fillcolor=yellow]; 48 [label="Function call: R|/id|(...)"]; - 49 [label="Access variable R|/y|"]; - 50 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 51 [label="Postponed enter to lambda"]; + 50 [label="Access variable R|/y|"]; + 51 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 52 [label="Postponed enter to lambda"]; subgraph cluster_9 { color=blue - 52 [label="Enter function anonymousFunction"]; - 53 [label="Access variable R|/x|"]; - 54 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 55 [label="Access variable R|/y|"]; - 56 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 57 [label="Const: Int(1)"]; - 58 [label="Exit function anonymousFunction"]; + 54 [label="Enter function anonymousFunction"]; + 56 [label="Access variable R|/x|"]; + 57 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 58 [label="Access variable R|/y|"]; + 59 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 60 [label="Const: Int(1)"]; + 55 [label="Exit function anonymousFunction"]; } - 59 [label="Postponed exit from lambda"]; - 60 [label="Function call: R|kotlin/run|(...)"]; - 61 [label="Call arguments union" style="filled" fillcolor=yellow]; + 53 [label="Postponed exit from lambda"]; + 61 [label="Function call: R|kotlin/run|(...)"]; + 63 [label="Call arguments union" style="filled" fillcolor=yellow]; 62 [label="Function call: R|/select|(...)"]; - 63 [label="Variable declaration: lval a: R|kotlin/Int|"]; - 64 [label="Access variable R|/x|"]; - 65 [label="Function call: R|/takeInt|(...)"]; - 66 [label="Access variable R|/y|"]; - 67 [label="Function call: R|/takeInt|(...)"]; - 68 [label="Access variable R|/a|"]; - 69 [label="Function call: R|/takeInt|(...)"]; - 70 [label="Exit function test_2" style="filled" fillcolor=red]; + 64 [label="Variable declaration: lval a: R|kotlin/Int|"]; + 65 [label="Access variable R|/x|"]; + 66 [label="Function call: R|/takeInt|(...)"]; + 67 [label="Access variable R|/y|"]; + 68 [label="Function call: R|/takeInt|(...)"]; + 69 [label="Access variable R|/a|"]; + 70 [label="Function call: R|/takeInt|(...)"]; + 38 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 37 -> {38}; - 38 -> {39}; - 38 -> {45} [color=red]; - 39 -> {40}; - 40 -> {41}; - 41 -> {42}; - 42 -> {43}; + 37 -> {39}; + 39 -> {41}; + 39 -> {40} [color=red]; + 40 -> {47}; + 41 -> {43}; + 42 -> {40} [color=green]; + 42 -> {49} [color=red]; 43 -> {44}; - 44 -> {45} [color=green]; - 44 -> {47} [color=red]; + 44 -> {45}; 45 -> {46}; - 46 -> {47}; - 47 -> {48}; - 48 -> {49}; - 49 -> {50}; + 46 -> {42}; + 47 -> {49}; + 48 -> {50}; + 49 -> {48}; 50 -> {51}; 51 -> {52}; - 51 -> {59} [color=red]; - 52 -> {53}; - 53 -> {54}; - 54 -> {55}; - 55 -> {56}; + 52 -> {54}; + 52 -> {53} [color=red]; + 53 -> {61}; + 54 -> {56}; + 55 -> {53} [color=green]; + 55 -> {63} [color=red]; 56 -> {57}; 57 -> {58}; - 58 -> {59} [color=green]; - 58 -> {61} [color=red]; + 58 -> {59}; 59 -> {60}; - 60 -> {61}; - 61 -> {62}; - 62 -> {63}; - 63 -> {64}; + 60 -> {55}; + 61 -> {63}; + 62 -> {64}; + 63 -> {62}; 64 -> {65}; 65 -> {66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; + 70 -> {38}; subgraph cluster_10 { color=red 71 [label="Enter function test_3" style="filled" fillcolor=red]; - 72 [label="Postponed enter to lambda"]; + 73 [label="Postponed enter to lambda"]; subgraph cluster_11 { color=blue - 73 [label="Enter function anonymousFunction"]; - 74 [label="Access variable R|/y|"]; - 75 [label="Function call: R|/y|.#()"]; - 76 [label="Access variable R|/x|"]; - 77 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 78 [label="Function call: R|/materialize|()"]; - 79 [label="Exit function anonymousFunction"]; + 75 [label="Enter function anonymousFunction"]; + 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="Function call: R|/materialize|()"]; + 76 [label="Exit function anonymousFunction"]; } - 80 [label="Postponed exit from lambda"]; - 81 [label="Function call: R|kotlin/run|(...)"]; - 82 [label="Function call: R|/id|(...)"]; - 83 [label="Postponed enter to lambda"]; + 74 [label="Postponed exit from lambda"]; + 82 [label="Function call: R|kotlin/run|(...)"]; + 83 [label="Function call: R|/id|(...)"]; + 84 [label="Postponed enter to lambda"]; subgraph cluster_12 { color=blue - 84 [label="Enter function anonymousFunction"]; - 85 [label="Access variable R|/y|"]; - 86 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 87 [label="Access variable R|/x|"]; - 88 [label="Function call: R|/x|.#()"]; - 89 [label="Access variable R|/y|"]; - 90 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 91 [label="Const: Int(1)"]; - 92 [label="Exit function anonymousFunction"]; + 86 [label="Enter function anonymousFunction"]; + 88 [label="Access variable R|/y|"]; + 89 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 90 [label="Access variable R|/x|"]; + 91 [label="Function call: R|/x|.#()"]; + 92 [label="Access variable R|/y|"]; + 93 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 94 [label="Const: Int(1)"]; + 87 [label="Exit function anonymousFunction"]; } - 93 [label="Postponed exit from lambda"]; - 94 [label="Function call: R|kotlin/run|(...)"]; - 95 [label="Call arguments union" style="filled" fillcolor=yellow]; + 85 [label="Postponed exit from lambda"]; + 95 [label="Function call: R|kotlin/run|(...)"]; + 97 [label="Call arguments union" style="filled" fillcolor=yellow]; 96 [label="Function call: R|/select|(...)"]; - 97 [label="Variable declaration: lval a: R|kotlin/Int|"]; - 98 [label="Access variable R|/x|"]; - 99 [label="Function call: R|/takeInt|(...)"]; - 100 [label="Access variable R|/y|"]; - 101 [label="Function call: R|/takeInt|(...)"]; - 102 [label="Access variable R|/a|"]; - 103 [label="Function call: R|/takeInt|(...)"]; - 104 [label="Exit function test_3" style="filled" fillcolor=red]; + 98 [label="Variable declaration: lval a: R|kotlin/Int|"]; + 99 [label="Access variable R|/x|"]; + 100 [label="Function call: R|/takeInt|(...)"]; + 101 [label="Access variable R|/y|"]; + 102 [label="Function call: R|/takeInt|(...)"]; + 103 [label="Access variable R|/a|"]; + 104 [label="Function call: R|/takeInt|(...)"]; + 72 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 71 -> {72}; - 72 -> {73}; - 72 -> {80} [color=red]; - 73 -> {74}; - 74 -> {75}; - 75 -> {76}; - 76 -> {77}; + 71 -> {73}; + 73 -> {75}; + 73 -> {74} [color=red]; + 74 -> {82}; + 75 -> {77}; + 76 -> {74} [color=green]; + 76 -> {97} [color=red]; 77 -> {78}; 78 -> {79}; - 79 -> {80} [color=green]; - 79 -> {95} [color=red]; + 79 -> {80}; 80 -> {81}; - 81 -> {82}; + 81 -> {76}; 82 -> {83}; 83 -> {84}; - 83 -> {93} [color=red]; - 84 -> {85}; - 85 -> {86}; - 86 -> {87}; - 87 -> {88}; + 84 -> {86}; + 84 -> {85} [color=red]; + 85 -> {95}; + 86 -> {88}; + 87 -> {85} [color=green]; + 87 -> {97} [color=red]; 88 -> {89}; 89 -> {90}; 90 -> {91}; 91 -> {92}; - 92 -> {93} [color=green]; - 92 -> {95} [color=red]; + 92 -> {93}; 93 -> {94}; - 94 -> {95}; - 95 -> {96}; - 96 -> {97}; - 97 -> {98}; + 94 -> {87}; + 95 -> {97}; + 96 -> {98}; + 97 -> {96}; 98 -> {99}; 99 -> {100}; 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; + 104 -> {72}; subgraph cluster_13 { color=red 105 [label="Enter function test_4" style="filled" fillcolor=red]; - 106 [label="Postponed enter to lambda"]; - 107 [label="Postponed exit from lambda"]; - 108 [label="Function call: R|/myRun|(...)"]; - 109 [label="Function call: R|/id|(...)"]; - 110 [label="Access variable R|/y|"]; - 111 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 112 [label="Postponed enter to lambda"]; - 113 [label="Postponed exit from lambda"]; - 114 [label="Function call: R|/myRun|(...)"]; - 115 [label="Function call: R|/select|(...)"]; - 116 [label="Variable declaration: lval a: R|kotlin/Int|"]; - 117 [label="Access variable R|/x|"]; + 107 [label="Postponed enter to lambda"]; + subgraph cluster_14 { + color=blue + 126 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + 128 [label="Access variable R|/y|"]; + 129 [label="Function call: R|/y|.#()"]; + 130 [label="Access variable R|/x|"]; + 131 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 127 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 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 + 132 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + 134 [label="Access variable R|/x|"]; + 135 [label="Function call: R|/x|.#()"]; + 136 [label="Access variable R|/y|"]; + 137 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 138 [label="Const: Int(1)"]; + 133 [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="Access variable R|/x|"]; - 120 [label="Function call: #(...)"]; - 121 [label="Access variable R|/y|"]; - 122 [label="Function call: R|/takeInt|(...)"]; - 123 [label="Access variable R|/a|"]; - 124 [label="Function call: R|/takeInt|(...)"]; - 125 [label="Exit function test_4" style="filled" fillcolor=red]; + 120 [label="Access variable R|/x|"]; + 121 [label="Function call: #(...)"]; + 122 [label="Access variable R|/y|"]; + 123 [label="Function call: R|/takeInt|(...)"]; + 124 [label="Access variable R|/a|"]; + 125 [label="Function call: R|/takeInt|(...)"]; + 106 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 105 -> {106}; - 106 -> {107 107} [color=green]; - 107 -> {108}; + 105 -> {107}; + 107 -> {108 108} [color=green]; + 107 -> {126} [color=red]; 108 -> {109}; 109 -> {110}; 110 -> {111}; 111 -> {112}; - 112 -> {113 113} [color=green]; - 113 -> {114}; + 112 -> {113}; + 113 -> {114 114} [color=green]; + 113 -> {132} [color=red]; 114 -> {115}; 115 -> {116}; 116 -> {117}; @@ -319,133 +330,108 @@ digraph flowFromInplaceLambda_kt { 122 -> {123}; 123 -> {124}; 124 -> {125}; - - subgraph cluster_14 { - color=red - 126 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 127 [label="Access variable R|/y|"]; - 128 [label="Function call: R|/y|.#()"]; - 129 [label="Access variable R|/x|"]; - 130 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 131 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 126 -> {127}; - 127 -> {128}; + 125 -> {106}; + 126 -> {128}; 128 -> {129}; 129 -> {130}; 130 -> {131}; - - subgraph cluster_15 { - color=red - 132 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 133 [label="Access variable R|/x|"]; - 134 [label="Function call: R|/x|.#()"]; - 135 [label="Access variable R|/y|"]; - 136 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 137 [label="Const: Int(1)"]; - 138 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 132 -> {133}; - 133 -> {134}; + 131 -> {127}; + 132 -> {134}; 134 -> {135}; 135 -> {136}; 136 -> {137}; 137 -> {138}; + 138 -> {133}; subgraph cluster_16 { color=red 139 [label="Enter function test_5" style="filled" fillcolor=red]; - 140 [label="Postponed enter to lambda"]; + 141 [label="Postponed enter to lambda"]; subgraph cluster_17 { color=blue - 141 [label="Enter function anonymousFunction"]; - 142 [label="Function call: R|/materialize|()"]; - 143 [label="Exit function anonymousFunction"]; + 143 [label="Enter function anonymousFunction"]; + 145 [label="Function call: R|/materialize|()"]; + 144 [label="Exit function anonymousFunction"]; } - 144 [label="Postponed exit from lambda"]; - 145 [label="Function call: R|kotlin/run|(...)"]; - 146 [label="Postponed enter to lambda"]; + 142 [label="Postponed exit from lambda"]; + 146 [label="Function call: R|kotlin/run|(...)"]; + 147 [label="Postponed enter to lambda"]; subgraph cluster_18 { color=blue - 147 [label="Enter function anonymousFunction"]; - 148 [label="Function call: R|/materialize|()"]; - 149 [label="Exit function anonymousFunction"]; + 149 [label="Enter function anonymousFunction"]; + 151 [label="Function call: R|/materialize|()"]; + 150 [label="Exit function anonymousFunction"]; } - 150 [label="Postponed exit from lambda"]; - 151 [label="Function call: R|kotlin/run|(...)"]; - 152 [label="Call arguments union" style="filled" fillcolor=yellow]; + 148 [label="Postponed exit from lambda"]; + 152 [label="Function call: R|kotlin/run|(...)"]; + 154 [label="Call arguments union" style="filled" fillcolor=yellow]; 153 [label="Function call: R|/select|(...)"]; - 154 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 155 [label="Access variable R|/x|"]; - 156 [label="Function call: R|/takeInt|(...)"]; - 157 [label="Exit function test_5" style="filled" fillcolor=red]; + 155 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 156 [label="Access variable R|/x|"]; + 157 [label="Function call: R|/takeInt|(...)"]; + 140 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 139 -> {140}; - 140 -> {141}; - 140 -> {144} [color=red]; - 141 -> {142}; - 142 -> {143}; - 143 -> {144} [color=green]; - 143 -> {152} [color=red]; - 144 -> {145}; - 145 -> {146}; + 139 -> {141}; + 141 -> {143}; + 141 -> {142} [color=red]; + 142 -> {146}; + 143 -> {145}; + 144 -> {142} [color=green]; + 144 -> {154} [color=red]; + 145 -> {144}; 146 -> {147}; - 146 -> {150} [color=red]; - 147 -> {148}; - 148 -> {149}; - 149 -> {150} [color=green]; - 149 -> {152} [color=red]; - 150 -> {151}; - 151 -> {152}; - 152 -> {153}; - 153 -> {154}; - 154 -> {155}; + 147 -> {149}; + 147 -> {148} [color=red]; + 148 -> {152}; + 149 -> {151}; + 150 -> {148} [color=green]; + 150 -> {154} [color=red]; + 151 -> {150}; + 152 -> {154}; + 153 -> {155}; + 154 -> {153}; 155 -> {156}; 156 -> {157}; + 157 -> {140}; subgraph cluster_19 { color=red 158 [label="Enter function test_6" style="filled" fillcolor=red]; - 159 [label="Postponed enter to lambda"]; - 160 [label="Postponed exit from lambda"]; - 161 [label="Function call: R|/myRun|(...)"]; - 162 [label="Function call: R|/id|(...)"]; - 163 [label="Variable declaration: lval x: R|kotlin/String|"]; - 164 [label="Exit function test_6" style="filled" fillcolor=red]; + 160 [label="Postponed enter to lambda"]; + subgraph cluster_20 { + color=blue + 165 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + 167 [label="Postponed enter to lambda"]; + subgraph cluster_21 { + color=blue + 169 [label="Enter function anonymousFunction"]; + 171 [label="Function call: R|/materialize|()"]; + 170 [label="Exit function anonymousFunction"]; + } + 168 [label="Postponed exit from lambda"]; + 172 [label="Function call: R|kotlin/run|(...)"]; + 166 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 161 [label="Postponed exit from lambda"]; + 162 [label="Function call: R|/myRun|(...)"]; + 163 [label="Function call: R|/id|(...)"]; + 164 [label="Variable declaration: lval x: R|kotlin/String|"]; + 159 [label="Exit function test_6" style="filled" fillcolor=red]; } - - 158 -> {159}; - 159 -> {160 160} [color=green]; - 160 -> {161}; + 158 -> {160}; + 160 -> {161 161} [color=green]; + 160 -> {165} [color=red]; 161 -> {162}; 162 -> {163}; 163 -> {164}; - - subgraph cluster_20 { - color=red - 165 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 166 [label="Postponed enter to lambda"]; - subgraph cluster_21 { - color=blue - 167 [label="Enter function anonymousFunction"]; - 168 [label="Function call: R|/materialize|()"]; - 169 [label="Exit function anonymousFunction"]; - } - 170 [label="Postponed exit from lambda"]; - 171 [label="Function call: R|kotlin/run|(...)"]; - 172 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 165 -> {166}; - 166 -> {167}; - 166 -> {170} [color=red]; - 167 -> {168}; - 168 -> {169}; - 169 -> {170} [color=green]; - 170 -> {171}; - 171 -> {172}; + 164 -> {159}; + 165 -> {167}; + 167 -> {169}; + 167 -> {168} [color=red]; + 168 -> {172}; + 169 -> {171}; + 170 -> {168} [color=green]; + 171 -> {170}; + 172 -> {166}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot index 8a26786dc56..5ba9741cdb6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot @@ -6,84 +6,80 @@ digraph initBlock_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red - 3 [label="Enter init block" style="filled" fillcolor=red]; + 9 [label="Enter class Foo" style="filled" fillcolor=red]; subgraph cluster_2 { color=blue - 4 [label="Enter block"]; - 5 [label="Const: Int(1)"]; - 6 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 7 [label="Exit block"]; + 3 [label="Enter init block" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 5 [label="Enter block"]; + 6 [label="Const: Int(1)"]; + 7 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 8 [label="Exit block"]; + } + 4 [label="Exit init block" style="filled" fillcolor=red]; } - 8 [label="Exit init block" style="filled" fillcolor=red]; + 10 [label="Exit class Foo" style="filled" fillcolor=red]; } - - 3 -> {4}; - 4 -> {5}; + 9 -> {3} [color=green]; + 3 -> {5}; + 4 -> {10} [color=green]; 5 -> {6}; 6 -> {7}; 7 -> {8}; - - subgraph cluster_3 { - color=red - 9 [label="Enter class Foo" style="filled" fillcolor=red]; - 10 [label="Exit class Foo" style="filled" fillcolor=red]; - } - + 8 -> {4}; subgraph cluster_4 { color=red 11 [label="Enter function " style="filled" fillcolor=red]; - 12 [label="Delegated constructor call: super()"]; - 13 [label="Exit function " style="filled" fillcolor=red]; + 13 [label="Delegated constructor call: super()"]; + 12 [label="Exit function " style="filled" fillcolor=red]; } - - 11 -> {12}; - 12 -> {13}; + 11 -> {13}; + 13 -> {12}; subgraph cluster_5 { color=red - 14 [label="Enter init block" style="filled" fillcolor=red]; + 25 [label="Enter class Bar" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 15 [label="Enter block"]; - 16 [label="Const: Int(1)"]; - 17 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 18 [label="Function call: R|java/lang/Exception.Exception|()"]; - 19 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 20 [label="Stub" style="filled" fillcolor=gray]; - 21 [label="Const: Int(2)" style="filled" fillcolor=gray]; - 22 [label="Variable declaration: lval y: R|kotlin/Int|" style="filled" fillcolor=gray]; - 23 [label="Exit block" style="filled" fillcolor=gray]; + 14 [label="Enter init block" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 16 [label="Enter block"]; + 17 [label="Const: Int(1)"]; + 18 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 19 [label="Function call: R|java/lang/Exception.Exception|()"]; + 20 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 21 [label="Stub" style="filled" fillcolor=gray]; + 22 [label="Const: Int(2)" style="filled" fillcolor=gray]; + 23 [label="Variable declaration: lval y: R|kotlin/Int|" style="filled" fillcolor=gray]; + 24 [label="Exit block" style="filled" fillcolor=gray]; + } + 15 [label="Exit init block" style="filled" fillcolor=red]; } - 24 [label="Exit init block" style="filled" fillcolor=red]; + 26 [label="Exit class Bar" style="filled" fillcolor=red]; } - - 14 -> {15}; - 15 -> {16}; + 25 -> {14} [color=green]; + 14 -> {16}; + 15 -> {26} [color=green]; 16 -> {17}; 17 -> {18}; 18 -> {19}; - 19 -> {24}; - 19 -> {20} [style=dotted]; + 19 -> {20}; + 20 -> {15}; 20 -> {21} [style=dotted]; 21 -> {22} [style=dotted]; 22 -> {23} [style=dotted]; 23 -> {24} [style=dotted]; - - subgraph cluster_7 { - color=red - 25 [label="Enter class Bar" style="filled" fillcolor=red]; - 26 [label="Exit class Bar" style="filled" fillcolor=red]; - } - + 24 -> {15} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot index 33080949fb9..e3cac56478b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot @@ -8,7 +8,6 @@ digraph initBlockAndInPlaceLambda_kt { 0 [label="Enter class B" style="filled" fillcolor=red]; 1 [label="Exit class B" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; subgraph cluster_1 { @@ -16,87 +15,83 @@ digraph initBlockAndInPlaceLambda_kt { 2 [label="Enter function getter" style="filled" fillcolor=red]; 3 [label="Exit function getter" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { - color=red - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Exit property" style="filled" fillcolor=red]; - } - - 4 -> {5}; - - subgraph cluster_3 { color=red 6 [label="Enter class A" 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]; } - + 6 -> {4} [color=green]; + 4 -> {5}; + 5 -> {7} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function " style="filled" fillcolor=red]; - 9 [label="Delegated constructor call: super()"]; - 10 [label="Exit function " style="filled" fillcolor=red]; + 10 [label="Delegated constructor call: super()"]; + 9 [label="Exit function " style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; + 8 -> {10}; + 10 -> {9}; subgraph cluster_5 { color=red - 11 [label="Enter init block" style="filled" fillcolor=red]; + 29 [label="Enter class C" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 12 [label="Enter block"]; - 13 [label="Access variable R|/a|"]; - 14 [label="Access variable R|/A.b|"]; - 15 [label="Enter safe call"]; - 16 [label="Postponed enter to lambda"]; + 11 [label="Enter init block" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue - 17 [label="Enter function anonymousFunction"]; - 18 [label="Access variable R|/a|"]; - 19 [label="Access variable R|/it|"]; - 20 [label="Function call: R|/C.C|(...)"]; - 21 [label="Exit function anonymousFunction"]; + 13 [label="Enter block"]; + 14 [label="Access variable R|/a|"]; + 15 [label="Access variable R|/A.b|"]; + 16 [label="Enter safe call"]; + 18 [label="Postponed enter to lambda"]; + subgraph cluster_8 { + color=blue + 20 [label="Enter function anonymousFunction"]; + 22 [label="Access variable R|/a|"]; + 23 [label="Access variable R|/it|"]; + 24 [label="Function call: R|/C.C|(...)"]; + 21 [label="Exit function anonymousFunction"]; + } + 26 [label="Call arguments union" style="filled" fillcolor=yellow]; + 19 [label="Postponed exit from lambda"]; + 25 [label="Function call: R|/a|.R|/A.b|?.R|kotlin/let|(...)"]; + 17 [label="Exit safe call"]; + 27 [label="Variable declaration: lval c: R|C?|"]; + 28 [label="Exit block"]; } - 22 [label="Call arguments union" style="filled" fillcolor=yellow]; - 23 [label="Postponed exit from lambda"]; - 24 [label="Function call: R|/a|.R|/A.b|?.R|kotlin/let|(...)"]; - 25 [label="Exit safe call"]; - 26 [label="Variable declaration: lval c: R|C?|"]; - 27 [label="Exit block"]; + 12 [label="Exit init block" style="filled" fillcolor=red]; } - 28 [label="Exit init block" style="filled" fillcolor=red]; + 30 [label="Exit class C" style="filled" fillcolor=red]; } - - 11 -> {12}; - 12 -> {13}; + 29 -> {11} [color=green]; + 11 -> {13}; + 12 -> {30} [color=green]; 13 -> {14}; - 14 -> {15 25}; - 15 -> {16}; - 16 -> {17}; - 16 -> {23} [color=red]; - 17 -> {18}; - 18 -> {19}; - 19 -> {20}; - 20 -> {21}; - 21 -> {23} [color=green]; - 21 -> {22} [color=red]; - 22 -> {24} [color=red]; - 23 -> {24} [color=green]; - 24 -> {25}; - 25 -> {26}; - 26 -> {27}; + 14 -> {15}; + 15 -> {16 17}; + 16 -> {18}; + 17 -> {27}; + 18 -> {20}; + 18 -> {19} [color=red]; + 19 -> {25} [color=green]; + 20 -> {22}; + 21 -> {19} [color=green]; + 21 -> {26} [color=red]; + 22 -> {23}; + 23 -> {24}; + 24 -> {21}; + 25 -> {17}; + 26 -> {25} [color=red]; 27 -> {28}; - - subgraph cluster_8 { - color=red - 29 [label="Enter class C" style="filled" fillcolor=red]; - 30 [label="Exit class C" style="filled" fillcolor=red]; - } - + 28 -> {12}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.dot index 45bcfeceaef..81e2b04414a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.dot @@ -6,191 +6,187 @@ digraph inplaceLambdaInControlFlowExpressions_kt { subgraph cluster_0 { color=red 0 [label="Enter function materialize" style="filled" fillcolor=red]; - 1 [label="Const: Null(null)"]; - 2 [label="Check not null: Null(null)!!"]; - 3 [label="Jump: ^materialize Null(null)!!"]; - 4 [label="Stub" style="filled" fillcolor=gray]; - 5 [label="Exit 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]; + 1 [label="Exit function materialize" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; 2 -> {3}; - 3 -> {5}; - 3 -> {4} [style=dotted]; + 3 -> {4}; + 4 -> {1}; 4 -> {5} [style=dotted]; + 5 -> {1} [style=dotted]; subgraph cluster_1 { color=red 6 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_2 { color=blue - 7 [label="Enter when"]; + 8 [label="Enter when"]; subgraph cluster_3 { color=blue - 8 [label="Enter when branch condition "]; - 9 [label="Const: Boolean(true)"]; - 10 [label="Exit when branch condition"]; + 10 [label="Enter when branch condition "]; + 11 [label="Const: Boolean(true)"]; + 12 [label="Exit when branch condition"]; } subgraph cluster_4 { color=blue - 11 [label="Enter when branch condition else"]; - 12 [label="Exit when branch condition"]; + 23 [label="Enter when branch condition else"]; + 24 [label="Exit when branch condition"]; } - 13 [label="Enter when branch result"]; + 25 [label="Enter when branch result"]; subgraph cluster_5 { color=blue - 14 [label="Enter block"]; - 15 [label="Const: String()"]; - 16 [label="Exit block"]; + 26 [label="Enter block"]; + 27 [label="Const: String()"]; + 28 [label="Exit block"]; } - 17 [label="Exit when branch result"]; - 18 [label="Enter when branch result"]; + 29 [label="Exit when branch result"]; + 13 [label="Enter when branch result"]; subgraph cluster_6 { color=blue - 19 [label="Enter block"]; - 20 [label="Postponed enter to lambda"]; + 14 [label="Enter block"]; + 15 [label="Postponed enter to lambda"]; subgraph cluster_7 { color=blue - 21 [label="Enter function anonymousFunction"]; - 22 [label="Function call: R|/materialize|()"]; - 23 [label="Exit function anonymousFunction"]; + 17 [label="Enter function anonymousFunction"]; + 19 [label="Function call: R|/materialize|()"]; + 18 [label="Exit function anonymousFunction"]; } - 24 [label="Postponed exit from lambda"]; - 25 [label="Function call: R|kotlin/run|(...)"]; - 26 [label="Exit block"]; + 16 [label="Postponed exit from lambda"]; + 20 [label="Function call: R|kotlin/run|(...)"]; + 21 [label="Exit block"]; } - 27 [label="Exit when branch result"]; - 28 [label="Exit when"]; + 22 [label="Exit when branch result"]; + 9 [label="Exit when"]; } - 29 [label="Call arguments union" style="filled" fillcolor=yellow]; - 30 [label="Variable declaration: lval x: R|kotlin/String|"]; - 31 [label="Exit function test_1" style="filled" fillcolor=red]; + 30 [label="Call arguments union" style="filled" fillcolor=yellow]; + 31 [label="Variable declaration: lval x: R|kotlin/String|"]; + 7 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 6 -> {7}; - 7 -> {8}; - 8 -> {9}; - 9 -> {10}; - 10 -> {18 11}; + 6 -> {8}; + 8 -> {10}; + 9 -> {30}; + 10 -> {11}; 11 -> {12}; - 12 -> {13}; + 12 -> {13 23}; 13 -> {14}; 14 -> {15}; - 15 -> {16}; - 16 -> {17}; - 17 -> {28}; - 18 -> {19}; - 19 -> {20}; + 15 -> {17}; + 15 -> {16} [color=red]; + 16 -> {20}; + 17 -> {19}; + 18 -> {16} [color=green]; + 18 -> {30} [color=red]; + 19 -> {18}; 20 -> {21}; - 20 -> {24} [color=red]; 21 -> {22}; - 22 -> {23}; - 23 -> {24} [color=green]; - 23 -> {29} [color=red]; + 22 -> {9}; + 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; 28 -> {29}; - 29 -> {30}; + 29 -> {9}; 30 -> {31}; + 31 -> {7}; subgraph cluster_8 { color=red 32 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_9 { color=blue - 33 [label="Try expression enter"]; + 34 [label="Try expression enter"]; subgraph cluster_10 { color=blue - 34 [label="Try main block enter"]; + 36 [label="Try main block enter"]; subgraph cluster_11 { color=blue - 35 [label="Enter block"]; - 36 [label="Postponed enter to lambda"]; + 38 [label="Enter block"]; + 39 [label="Postponed enter to lambda"]; subgraph cluster_12 { color=blue - 37 [label="Enter function anonymousFunction"]; - 38 [label="Function call: R|/materialize|()"]; - 39 [label="Exit function anonymousFunction"]; + 41 [label="Enter function anonymousFunction"]; + 43 [label="Function call: R|/materialize|()"]; + 42 [label="Exit function anonymousFunction"]; } 40 [label="Postponed exit from lambda"]; - 41 [label="Function call: R|kotlin/run|(...)"]; - 42 [label="Exit block"]; + 44 [label="Function call: R|kotlin/run|(...)"]; + 45 [label="Exit block"]; } - 43 [label="Try main block exit"]; + 46 [label="Try main block exit"]; } subgraph cluster_13 { color=blue - 44 [label="Catch enter"]; + 37 [label="Catch enter"]; subgraph cluster_14 { color=blue - 45 [label="Enter block"]; - 46 [label="Const: String()"]; - 47 [label="Exit block"]; + 47 [label="Enter block"]; + 48 [label="Const: String()"]; + 49 [label="Exit block"]; } - 48 [label="Catch exit"]; + 50 [label="Catch exit"]; } - 49 [label="Try expression exit"]; + 35 [label="Try expression exit"]; } - 50 [label="Call arguments union" style="filled" fillcolor=yellow]; - 51 [label="Variable declaration: lval x: R|kotlin/String|"]; - 52 [label="Exit function test_2" style="filled" fillcolor=red]; + 51 [label="Call arguments union" style="filled" fillcolor=yellow]; + 52 [label="Variable declaration: lval x: R|kotlin/String|"]; + 33 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 32 -> {33}; - 33 -> {34}; - 34 -> {52 44 35}; - 35 -> {36}; - 36 -> {37}; - 36 -> {40} [color=red]; - 37 -> {38}; + 32 -> {34}; + 34 -> {36}; + 35 -> {51}; + 36 -> {33 37 38}; + 37 -> {33 47}; 38 -> {39}; - 39 -> {40} [color=green]; - 39 -> {50} [color=red]; - 40 -> {41}; - 41 -> {42}; - 42 -> {43}; - 43 -> {49}; - 44 -> {52 45}; + 39 -> {41}; + 39 -> {40} [color=red]; + 40 -> {44}; + 41 -> {43}; + 42 -> {40} [color=green]; + 42 -> {51} [color=red]; + 43 -> {42}; + 44 -> {45}; 45 -> {46}; - 46 -> {47}; + 46 -> {35}; 47 -> {48}; 48 -> {49}; 49 -> {50}; - 50 -> {51}; + 50 -> {35}; 51 -> {52}; + 52 -> {33}; subgraph cluster_15 { color=red 53 [label="Enter function test_3" style="filled" fillcolor=red]; - 54 [label="Postponed enter to lambda"]; + 55 [label="Postponed enter to lambda"]; subgraph cluster_16 { color=blue - 55 [label="Enter function anonymousFunction"]; - 56 [label="Function call: R|/materialize|()"]; - 57 [label="Exit function anonymousFunction"]; + 57 [label="Enter function anonymousFunction"]; + 59 [label="Function call: R|/materialize|()"]; + 58 [label="Exit function anonymousFunction"]; } - 58 [label="Postponed exit from lambda"]; - 59 [label="Function call: R|kotlin/run|(...)"]; - 60 [label="Check not null: R|kotlin/run|(...)!!"]; - 61 [label="Call arguments union" style="filled" fillcolor=yellow]; - 62 [label="Variable declaration: lval x: R|kotlin/String|"]; - 63 [label="Exit function test_3" style="filled" fillcolor=red]; + 56 [label="Postponed exit from lambda"]; + 60 [label="Function call: R|kotlin/run|(...)"]; + 61 [label="Check not null: R|kotlin/run|(...)!!"]; + 62 [label="Call arguments union" style="filled" fillcolor=yellow]; + 63 [label="Variable declaration: lval x: R|kotlin/String|"]; + 54 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 53 -> {54}; - 54 -> {55}; - 54 -> {58} [color=red]; - 55 -> {56}; - 56 -> {57}; - 57 -> {58} [color=green]; - 57 -> {61} [color=red]; - 58 -> {59}; - 59 -> {60}; + 53 -> {55}; + 55 -> {57}; + 55 -> {56} [color=red]; + 56 -> {60}; + 57 -> {59}; + 58 -> {56} [color=green]; + 58 -> {62} [color=red]; + 59 -> {58}; 60 -> {61}; 61 -> {62}; 62 -> {63}; + 63 -> {54}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/jumps.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/jumps.dot index d984b9d4830..d6466ad1034 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/jumps.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/jumps.dot @@ -8,355 +8,348 @@ digraph jumps_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; + 2 [label="Enter when"]; subgraph cluster_2 { color=blue - 2 [label="Enter when branch condition "]; - 3 [label="Access variable R|/x|"]; - 4 [label="Const: Null(null)"]; - 5 [label="Operator =="]; - 6 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_3 { color=blue - 7 [label="Enter when branch condition else"]; - 8 [label="Exit when branch condition"]; + 16 [label="Enter when branch condition else"]; + 17 [label="Exit when branch condition"]; } - 9 [label="Enter when branch result"]; + 18 [label="Enter when branch result"]; subgraph cluster_4 { color=blue - 10 [label="Enter block"]; - 11 [label="Access variable R|/x|"]; - 12 [label="Exit block"]; + 19 [label="Enter block"]; + 20 [label="Access variable R|/x|"]; + 21 [label="Exit block"]; } - 13 [label="Exit when branch result"]; - 14 [label="Enter when branch result"]; + 22 [label="Exit when branch result"]; + 9 [label="Enter when branch result"]; subgraph cluster_5 { color=blue - 15 [label="Enter block"]; - 16 [label="Function call: R|java/lang/Exception.Exception|()"]; - 17 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 18 [label="Stub" style="filled" fillcolor=gray]; - 19 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 20 [label="Exit when branch result" style="filled" fillcolor=gray]; - 21 [label="Exit when"]; + 15 [label="Exit when branch result" style="filled" fillcolor=gray]; + 3 [label="Exit when"]; } - 22 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 23 [label="Access variable R|/y|"]; - 24 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 25 [label="Access variable R|/x|"]; - 26 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 27 [label="Exit function test_1" style="filled" fillcolor=red]; + 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 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; + 0 -> {2}; + 2 -> {4}; + 3 -> {23}; 4 -> {5}; 5 -> {6}; - 6 -> {14 7}; + 6 -> {7}; 7 -> {8}; - 8 -> {9}; + 8 -> {9 16}; 9 -> {10}; 10 -> {11}; 11 -> {12}; - 12 -> {13}; - 13 -> {21}; - 14 -> {15}; - 15 -> {16}; + 12 -> {1}; + 12 -> {13} [style=dotted]; + 13 -> {14} [style=dotted]; + 14 -> {15} [style=dotted]; + 15 -> {3} [style=dotted]; 16 -> {17}; - 17 -> {27}; - 17 -> {18} [style=dotted]; - 18 -> {19} [style=dotted]; - 19 -> {20} [style=dotted]; - 20 -> {21} [style=dotted]; + 17 -> {18}; + 18 -> {19}; + 19 -> {20}; + 20 -> {21}; 21 -> {22}; - 22 -> {23}; + 22 -> {3}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; + 27 -> {1}; subgraph cluster_6 { color=red 28 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue - 29 [label="Enter when"]; + 30 [label="Enter when"]; subgraph cluster_8 { color=blue - 30 [label="Enter when branch condition "]; - 31 [label="Access variable R|/x|"]; - 32 [label="Const: Null(null)"]; - 33 [label="Operator =="]; - 34 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_9 { color=blue - 35 [label="Enter when branch condition else"]; - 36 [label="Exit when branch condition"]; + 42 [label="Enter when branch condition else"]; + 43 [label="Exit when branch condition"]; } - 37 [label="Enter when branch result"]; + 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"]; - 42 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 43 [label="Enter block"]; - 44 [label="Access variable R|/x|"]; - 45 [label="Exit block"]; - } - 46 [label="Exit when branch result"]; - 47 [label="Exit when"]; + 31 [label="Exit when"]; } - 48 [label="Variable declaration: lval y: R|kotlin/Int?|"]; - 49 [label="Access variable R|/y|"]; - 50 [label="Function call: R|/y|.#()"]; - 51 [label="Exit function test_2" style="filled" fillcolor=red]; + 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]; } - - 28 -> {29}; - 29 -> {30}; - 30 -> {31}; - 31 -> {32}; + 28 -> {30}; + 30 -> {32}; + 31 -> {49}; 32 -> {33}; 33 -> {34}; - 34 -> {42 35}; + 34 -> {35}; 35 -> {36}; - 36 -> {37}; + 36 -> {37 42}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; - 41 -> {47}; + 41 -> {31}; 42 -> {43}; 43 -> {44}; 44 -> {45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {49}; + 48 -> {31}; 49 -> {50}; 50 -> {51}; + 51 -> {29}; subgraph cluster_12 { color=red 52 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_13 { color=blue - 53 [label="Enter while loop"]; + 54 [label="Enter while loop"]; subgraph cluster_14 { color=blue - 54 [label="Enter loop condition"]; - 55 [label="Const: Boolean(true)"]; - 56 [label="Exit loop condition"]; + 56 [label="Enter loop condition"]; + 57 [label="Const: Boolean(true)"]; + 58 [label="Exit loop condition"]; } subgraph cluster_15 { color=blue - 57 [label="Enter loop block"]; + 59 [label="Enter loop block"]; subgraph cluster_16 { color=blue - 58 [label="Enter block"]; - 59 [label="Access variable R|/x|"]; - 60 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 61 [label="Jump: break@@@[Boolean(true)] "]; - 62 [label="Stub" style="filled" fillcolor=gray]; - 63 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 64 [label="Exit loop block" style="filled" fillcolor=gray]; + 66 [label="Exit loop block" style="filled" fillcolor=gray]; } - 65 [label="Exit whileloop"]; + 55 [label="Exit whileloop"]; } - 66 [label="Access variable R|/x|"]; - 67 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 68 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - - 52 -> {53}; - 53 -> {54}; - 54 -> {55}; - 55 -> {56}; + 52 -> {54}; + 54 -> {56}; + 55 -> {67}; 56 -> {57}; - 56 -> {65} [style=dotted]; 57 -> {58}; 58 -> {59}; + 58 -> {55} [style=dotted]; 59 -> {60}; 60 -> {61}; - 61 -> {65}; - 61 -> {62} [style=dotted]; - 62 -> {63} [style=dotted]; + 61 -> {62}; + 62 -> {63}; + 63 -> {55}; 63 -> {64} [style=dotted]; - 64 -> {54} [style=dotted]; - 65 -> {66}; - 66 -> {67}; + 64 -> {65} [style=dotted]; + 65 -> {66} [style=dotted]; + 66 -> {56} [style=dotted]; 67 -> {68}; + 68 -> {53}; subgraph cluster_17 { color=red 69 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_18 { color=blue - 70 [label="Enter do-while loop"]; + 71 [label="Enter do-while loop"]; subgraph cluster_19 { color=blue - 71 [label="Enter loop block"]; + 73 [label="Enter loop block"]; subgraph cluster_20 { color=blue - 72 [label="Enter block"]; - 73 [label="Access variable R|/x|"]; - 74 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 75 [label="Jump: break@@@[Boolean(true)] "]; - 76 [label="Stub" style="filled" fillcolor=gray]; - 77 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 78 [label="Exit loop block" style="filled" fillcolor=gray]; + 80 [label="Exit loop block" style="filled" fillcolor=gray]; } subgraph cluster_21 { color=blue - 79 [label="Enter loop condition" style="filled" fillcolor=gray]; - 80 [label="Const: Boolean(true)" style="filled" fillcolor=gray]; - 81 [label="Exit loop condition" style="filled" fillcolor=gray]; + 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]; } - 82 [label="Exit do-whileloop"]; + 72 [label="Exit do-whileloop"]; } - 83 [label="Access variable R|/x|"]; - 84 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 85 [label="Exit function test_4" style="filled" fillcolor=red]; + 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 -> {70}; - 70 -> {71}; - 71 -> {72}; - 72 -> {73}; + 69 -> {71}; + 71 -> {73}; + 72 -> {84}; 73 -> {74}; 74 -> {75}; - 75 -> {82}; - 75 -> {76} [style=dotted]; - 76 -> {77} [style=dotted]; + 75 -> {76}; + 76 -> {77}; + 77 -> {72}; 77 -> {78} [style=dotted]; 78 -> {79} [style=dotted]; 79 -> {80} [style=dotted]; 80 -> {81} [style=dotted]; - 81 -> {71 82} [style=dotted]; - 82 -> {83}; - 83 -> {84}; + 81 -> {82} [style=dotted]; + 82 -> {83} [style=dotted]; + 83 -> {73 72} [style=dotted]; 84 -> {85}; + 85 -> {70}; subgraph cluster_22 { color=red 86 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_23 { color=blue - 87 [label="Enter while loop"]; + 88 [label="Enter while loop"]; subgraph cluster_24 { color=blue - 88 [label="Enter loop condition"]; - 89 [label="Access variable R|/b|"]; - 90 [label="Exit loop condition"]; + 90 [label="Enter loop condition"]; + 91 [label="Access variable R|/b|"]; + 92 [label="Exit loop condition"]; } subgraph cluster_25 { color=blue - 91 [label="Enter loop block"]; + 93 [label="Enter loop block"]; subgraph cluster_26 { color=blue - 92 [label="Enter block"]; + 94 [label="Enter block"]; subgraph cluster_27 { color=blue - 93 [label="Enter when"]; + 95 [label="Enter when"]; subgraph cluster_28 { color=blue - 94 [label="Enter when branch condition "]; - 95 [label="Access variable R|/b|"]; - 96 [label="Exit when branch condition"]; + 97 [label="Enter when branch condition "]; + 98 [label="Access variable R|/b|"]; + 99 [label="Exit when branch condition"]; } - 97 [label="Synthetic else branch"]; - 98 [label="Enter when branch result"]; + 106 [label="Synthetic else branch"]; + 100 [label="Enter when branch result"]; subgraph cluster_29 { color=blue - 99 [label="Enter block"]; - 100 [label="Jump: continue@@@[R|/b|] "]; - 101 [label="Stub" style="filled" fillcolor=gray]; - 102 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 103 [label="Exit when branch result" style="filled" fillcolor=gray]; - 104 [label="Exit when"]; + 105 [label="Exit when branch result" style="filled" fillcolor=gray]; + 96 [label="Exit when"]; } - 105 [label="Exit block"]; + 107 [label="Exit block"]; } - 106 [label="Exit loop block"]; + 108 [label="Exit loop block"]; } - 107 [label="Exit whileloop"]; + 89 [label="Exit whileloop"]; } - 108 [label="Exit function test_5" style="filled" fillcolor=red]; + 87 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 86 -> {87}; - 87 -> {88}; - 88 -> {89}; - 89 -> {90}; - 90 -> {107 91}; + 86 -> {88}; + 88 -> {90}; + 89 -> {87}; + 90 -> {91}; 91 -> {92}; - 92 -> {93}; + 92 -> {89 93}; 93 -> {94}; 94 -> {95}; - 95 -> {96}; - 96 -> {98 97}; - 97 -> {104}; + 95 -> {97}; + 96 -> {107}; + 97 -> {98}; 98 -> {99}; - 99 -> {100}; - 100 -> {87}; - 100 -> {101} [style=dotted]; - 101 -> {102} [style=dotted]; + 99 -> {100 106}; + 100 -> {101}; + 101 -> {102}; + 102 -> {88}; 102 -> {103} [style=dotted]; 103 -> {104} [style=dotted]; - 104 -> {105}; - 105 -> {106}; - 106 -> {88}; + 104 -> {105} [style=dotted]; + 105 -> {96} [style=dotted]; + 106 -> {96}; 107 -> {108}; + 108 -> {90}; subgraph cluster_30 { color=red 109 [label="Enter function run" style="filled" fillcolor=red]; - 110 [label="Function call: R|/block|.R|FakeOverride|()"]; - 111 [label="Exit function run" style="filled" fillcolor=red]; + 111 [label="Function call: R|/block|.R|FakeOverride|()"]; + 110 [label="Exit function run" style="filled" fillcolor=red]; } - - 109 -> {110}; - 110 -> {111}; + 109 -> {111}; + 111 -> {110}; subgraph cluster_31 { color=red 112 [label="Enter function test_6" style="filled" fillcolor=red]; - 113 [label="Postponed enter to lambda"]; + 114 [label="Postponed enter to lambda"]; subgraph cluster_32 { color=blue - 114 [label="Enter function anonymousFunction"]; - 115 [label="Jump: ^@run Unit"]; - 116 [label="Stub" style="filled" fillcolor=gray]; + 116 [label="Enter function anonymousFunction"]; + 118 [label="Jump: ^@run Unit"]; + 119 [label="Stub" style="filled" fillcolor=gray]; 117 [label="Exit function anonymousFunction"]; } - 118 [label="Postponed exit from lambda"]; - 119 [label="Function call: R|/run|(...)"]; - 120 [label="Exit function test_6" style="filled" fillcolor=red]; + 115 [label="Postponed exit from lambda"]; + 120 [label="Function call: R|/run|(...)"]; + 113 [label="Exit function test_6" style="filled" fillcolor=red]; } - - 112 -> {113}; - 113 -> {114}; - 113 -> {118} [color=red]; - 114 -> {117 115}; - 115 -> {117}; - 115 -> {116} [style=dotted]; - 116 -> {117} [style=dotted]; - 117 -> {114}; - 117 -> {118} [color=green]; - 118 -> {119}; - 119 -> {120}; + 112 -> {114}; + 114 -> {116}; + 114 -> {115} [color=red]; + 115 -> {120}; + 116 -> {117 118}; + 117 -> {116}; + 117 -> {115} [color=green]; + 118 -> {117}; + 118 -> {119} [style=dotted]; + 119 -> {117} [style=dotted]; + 120 -> {113}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaAsReturnOfLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaAsReturnOfLambda.dot index 5e2b0e3ffa3..524371b887e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaAsReturnOfLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaAsReturnOfLambda.dot @@ -4,76 +4,77 @@ digraph lambdaAsReturnOfLambda_kt { edge [penwidth=2] subgraph cluster_0 { - color=red - 0 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 1 [label="Jump: ^@run lambda@fun (foo: R|kotlin/String|): R|kotlin/Unit| { - R|/bar|(R|/foo|) -} -"]; - 2 [label="Stub" style="filled" fillcolor=gray]; - 3 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 0 -> {1}; - 1 -> {3}; - 1 -> {2} [style=dotted]; - 2 -> {3} [style=dotted]; - - subgraph cluster_1 { - color=red - 4 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 5 [label="Access variable R|/foo|"]; - 6 [label="Function call: R|/bar|(...)"]; - 7 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - - subgraph cluster_2 { color=red 8 [label="Enter function getter" style="filled" fillcolor=red]; 9 [label="Exit function getter" style="filled" fillcolor=red]; } - 8 -> {9}; - subgraph cluster_3 { + subgraph cluster_1 { color=red 10 [label="Enter property" style="filled" fillcolor=red]; - 11 [label="Postponed enter to lambda"]; - 12 [label="Postponed exit from lambda"]; - 13 [label="Function call: R|/run| kotlin/Unit|>(...)"]; - 14 [label="Exit property" style="filled" fillcolor=red]; + 12 [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| { + R|/bar|(R|/foo|) +} +"]; + 3 [label="Stub" style="filled" fillcolor=gray]; + 1 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + subgraph cluster_3 { + 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]; + } + 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]; } - - 10 -> {11}; - 11 -> {12 12} [color=green]; - 12 -> {13}; + 10 -> {12}; + 12 -> {13 13} [color=green]; + 12 -> {0} [color=red]; 13 -> {14}; - - subgraph cluster_4 { - color=red - 15 [label="Enter function bar" style="filled" fillcolor=red]; - 16 [label="Exit function bar" style="filled" fillcolor=red]; - } - + 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}; subgraph cluster_5 { color=red - 17 [label="Enter function run" style="filled" fillcolor=red]; - 18 [label="Function call: R|/block|.R|FakeOverride|()"]; - 19 [label="Jump: ^run R|/block|.R|FakeOverride|()"]; - 20 [label="Stub" style="filled" fillcolor=gray]; - 21 [label="Exit function run" style="filled" fillcolor=red]; + 17 [label="Enter function bar" style="filled" fillcolor=red]; + 18 [label="Exit function bar" style="filled" fillcolor=red]; } - 17 -> {18}; - 18 -> {19}; + + 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}; - 19 -> {20} [style=dotted]; - 20 -> {21} [style=dotted]; + 21 -> {22}; + 22 -> {20}; + 22 -> {23} [style=dotted]; + 23 -> {20} [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 4fe344f108a..cb0647826a3 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot @@ -8,7 +8,6 @@ digraph lambdaReturningObject_kt { 0 [label="Enter class Out" style="filled" fillcolor=red]; 1 [label="Exit class Out" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph lambdaReturningObject_kt { 2 [label="Enter function bar" style="filled" fillcolor=red]; 3 [label="Exit function bar" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { @@ -24,68 +22,62 @@ digraph lambdaReturningObject_kt { 4 [label="Enter class IrTypeArgument" style="filled" fillcolor=red]; 5 [label="Exit class IrTypeArgument" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; subgraph cluster_3 { color=red 6 [label="Enter function " style="filled" fillcolor=red]; - 7 [label="Delegated constructor call: super()"]; - 8 [label="Exit function " style="filled" fillcolor=red]; + 8 [label="Delegated constructor call: super()"]; + 7 [label="Exit function " style="filled" fillcolor=red]; } - - 6 -> {7}; - 7 -> {8}; + 6 -> {8}; + 8 -> {7}; subgraph cluster_4 { color=red 9 [label="Enter class IrStarProjectionImpl" style="filled" fillcolor=red]; 10 [label="Exit class IrStarProjectionImpl" style="filled" fillcolor=red]; } - 9 -> {10} [color=green]; subgraph cluster_5 { color=red 11 [label="Enter function MyOut" style="filled" fillcolor=red]; - 12 [label="Function call: R|kotlin/TODO|()"]; - 13 [label="Stub" style="filled" fillcolor=gray]; - 14 [label="Jump: ^MyOut R|kotlin/TODO|()" style="filled" fillcolor=gray]; - 15 [label="Stub" style="filled" fillcolor=gray]; - 16 [label="Exit 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]; } - - 11 -> {12}; - 12 -> {16}; - 12 -> {13} [style=dotted]; + 11 -> {13}; + 13 -> {12}; 13 -> {14} [style=dotted]; - 14 -> {16 15} [style=dotted]; - 15 -> {16} [style=dotted]; + 14 -> {15} [style=dotted]; + 15 -> {12 16} [style=dotted]; + 16 -> {12} [style=dotted]; subgraph cluster_6 { color=red 17 [label="Enter function foo" style="filled" fillcolor=red]; - 18 [label="Postponed enter to lambda"]; - 19 [label="Postponed exit from lambda"]; - 20 [label="Function call: R|/MyOut|(...)"]; - 21 [label="Function call: R|/bar|(...)"]; - 22 [label="Exit function foo" style="filled" fillcolor=red]; + 19 [label="Postponed enter to lambda"]; + 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]; + } + 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]; } - - 17 -> {18}; - 18 -> {19 19} [color=green]; - 19 -> {20}; + 17 -> {19}; + 19 -> {20 20} [color=green]; + 19 -> {23} [color=red]; 20 -> {21}; 21 -> {22}; - - subgraph cluster_7 { - color=red - 23 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 24 [label="Access qualifier /IrStarProjectionImpl"]; - 25 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 23 -> {24}; - 24 -> {25}; + 22 -> {18}; + 23 -> {25}; + 25 -> {24}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot index f5c75218506..a73455a778a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot @@ -6,215 +6,208 @@ digraph lambdas_kt { subgraph cluster_0 { color=red 0 [label="Enter function run" style="filled" fillcolor=red]; - 1 [label="Function call: R|/block|.R|FakeOverride|()"]; - 2 [label="Exit function run" style="filled" fillcolor=red]; + 2 [label="Function call: R|/block|.R|FakeOverride|()"]; + 1 [label="Exit function run" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_2 { color=blue - 4 [label="Enter when"]; + 5 [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/Int|)"]; - 8 [label="Exit when branch condition"]; + 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"]; } - 9 [label="Synthetic else branch"]; - 10 [label="Enter when branch result"]; + 22 [label="Synthetic else branch"]; + 11 [label="Enter when branch result"]; subgraph cluster_4 { color=blue - 11 [label="Enter block"]; - 12 [label="Postponed enter to lambda"]; + 12 [label="Enter block"]; + 13 [label="Postponed enter to lambda"]; subgraph cluster_5 { color=blue - 13 [label="Enter function anonymousFunction"]; - 14 [label="Access variable R|/x|"]; - 15 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 15 [label="Enter function anonymousFunction"]; + 17 [label="Access variable R|/x|"]; + 18 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; 16 [label="Exit function anonymousFunction"]; } - 17 [label="Postponed exit from lambda"]; - 18 [label="Function call: R|/run|(...)"]; - 19 [label="Exit block"]; + 14 [label="Postponed exit from lambda"]; + 19 [label="Function call: R|/run|(...)"]; + 20 [label="Exit block"]; } - 20 [label="Exit when branch result"]; - 21 [label="Exit when"]; + 21 [label="Exit when branch result"]; + 6 [label="Exit when"]; } - 22 [label="Exit function test_1" style="filled" fillcolor=red]; + 4 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 3 -> {4}; - 4 -> {5}; - 5 -> {6}; - 6 -> {7}; + 3 -> {5}; + 5 -> {7}; + 6 -> {4}; 7 -> {8}; - 8 -> {10 9}; - 9 -> {21}; - 10 -> {11}; + 8 -> {9}; + 9 -> {10}; + 10 -> {11 22}; 11 -> {12}; 12 -> {13}; - 12 -> {17} [color=red]; - 13 -> {16 14}; - 14 -> {15}; - 15 -> {16}; - 16 -> {13}; - 16 -> {17} [color=green]; + 13 -> {15}; + 13 -> {14} [color=red]; + 14 -> {19}; + 15 -> {16 17}; + 16 -> {15}; + 16 -> {14} [color=green]; 17 -> {18}; - 18 -> {19}; + 18 -> {16}; 19 -> {20}; 20 -> {21}; - 21 -> {22}; + 21 -> {6}; + 22 -> {6}; subgraph cluster_6 { color=red 23 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue - 24 [label="Enter when"]; + 25 [label="Enter when"]; subgraph cluster_8 { color=blue - 25 [label="Enter when branch condition "]; - 26 [label="Access variable R|/x|"]; - 27 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 28 [label="Exit when branch condition"]; + 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"]; } - 29 [label="Synthetic else branch"]; - 30 [label="Enter when branch result"]; + 36 [label="Synthetic else branch"]; + 31 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 31 [label="Enter block"]; - 32 [label="Variable declaration: lval lambda: R|() -> kotlin/Int|"]; - 33 [label="Exit block"]; + 32 [label="Enter block"]; + 33 [label="Variable declaration: lval lambda: R|() -> kotlin/Int|"]; + 34 [label="Exit block"]; } - 34 [label="Exit when branch result"]; - 35 [label="Exit when"]; + 35 [label="Exit when branch result"]; + 26 [label="Exit when"]; + } + 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]; } - 36 [label="Exit function test_2" style="filled" fillcolor=red]; + 24 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 23 -> {24}; - 24 -> {25}; - 25 -> {26}; - 26 -> {27}; + 23 -> {25}; + 25 -> {27}; + 26 -> {24}; 27 -> {28}; - 28 -> {30 29}; - 29 -> {35}; - 30 -> {31}; + 28 -> {29}; + 29 -> {30}; + 30 -> {31 36}; 31 -> {32}; 32 -> {33}; + 32 -> {37} [color=red]; 33 -> {34}; 34 -> {35}; - 35 -> {36}; - - subgraph cluster_10 { - color=red - 37 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 38 [label="Access variable R|/x|"]; - 39 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 40 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 37 -> {38}; - 38 -> {39}; + 35 -> {26}; + 36 -> {26}; + 37 -> {39}; 39 -> {40}; + 40 -> {38}; subgraph cluster_11 { color=red 41 [label="Enter function getInt" style="filled" fillcolor=red]; - 42 [label="Function call: R|/block|.R|FakeOverride|()"]; - 43 [label="Const: Int(1)"]; - 44 [label="Jump: ^getInt Int(1)"]; - 45 [label="Stub" style="filled" fillcolor=gray]; - 46 [label="Exit 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 -> {42}; - 42 -> {43}; + 41 -> {43}; 43 -> {44}; - 44 -> {46}; - 44 -> {45} [style=dotted]; + 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]; - 48 [label="Postponed enter to lambda"]; + 49 [label="Postponed enter to lambda"]; subgraph cluster_13 { color=blue - 49 [label="Enter function anonymousFunction"]; - 50 [label="Const: Int(1)"]; - 51 [label="Jump: ^test_3 Int(1)"]; - 52 [label="Stub" style="filled" fillcolor=gray]; - 53 [label="Exit function anonymousFunction"]; + 51 [label="Enter function anonymousFunction"]; + 53 [label="Const: Int(1)"]; + 54 [label="Jump: ^test_3 Int(1)"]; + 55 [label="Stub" style="filled" fillcolor=gray]; + 52 [label="Exit function anonymousFunction"]; } - 54 [label="Postponed exit from lambda"]; - 55 [label="Function call: R|/getInt|(...)"]; - 56 [label="Jump: ^test_3 R|/getInt|( = getInt@fun (): R|kotlin/Unit| { + 50 [label="Postponed exit from lambda"]; + 56 [label="Function call: R|/getInt|(...)"]; + 57 [label="Jump: ^test_3 R|/getInt|( = getInt@fun (): R|kotlin/Unit| { ^test_3 Int(1) } )"]; - 57 [label="Stub" style="filled" fillcolor=gray]; - 58 [label="Exit function test_3" style="filled" fillcolor=red]; + 58 [label="Stub" style="filled" fillcolor=gray]; + 48 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 47 -> {48}; - 48 -> {49}; - 48 -> {54} [color=red]; - 49 -> {53 50}; - 50 -> {51}; - 51 -> {58}; - 51 -> {52} [style=dotted]; - 52 -> {53} [style=dotted]; - 53 -> {49}; - 53 -> {54} [color=green]; - 54 -> {55}; - 55 -> {56}; - 56 -> {58}; - 56 -> {57} [style=dotted]; + 47 -> {49}; + 49 -> {51}; + 49 -> {50} [color=red]; + 50 -> {56}; + 51 -> {52 53}; + 52 -> {51}; + 52 -> {50} [color=green]; + 53 -> {54}; + 54 -> {48}; + 54 -> {55} [style=dotted]; + 55 -> {52} [style=dotted]; + 56 -> {57}; + 57 -> {48}; 57 -> {58} [style=dotted]; + 58 -> {48} [style=dotted]; subgraph cluster_14 { color=red 59 [label="Enter function test_4" style="filled" fillcolor=red]; - 60 [label="Postponed enter to lambda"]; + 61 [label="Postponed enter to lambda"]; subgraph cluster_15 { color=blue - 61 [label="Enter function anonymousFunction"]; - 62 [label="Const: Int(1)"]; - 63 [label="Jump: ^test_4 Int(1)"]; - 64 [label="Stub" style="filled" fillcolor=gray]; - 65 [label="Exit function anonymousFunction"]; + 63 [label="Enter function anonymousFunction"]; + 65 [label="Const: Int(1)"]; + 66 [label="Jump: ^test_4 Int(1)"]; + 67 [label="Stub" style="filled" fillcolor=gray]; + 64 [label="Exit function anonymousFunction"]; } - 66 [label="Postponed exit from lambda"]; - 67 [label="Function call: R|/getInt|(...)"]; - 68 [label="Jump: ^test_4 R|/getInt|(block = getInt@fun (): R|kotlin/Unit| { + 62 [label="Postponed exit from lambda"]; + 68 [label="Function call: R|/getInt|(...)"]; + 69 [label="Jump: ^test_4 R|/getInt|(block = getInt@fun (): R|kotlin/Unit| { ^test_4 Int(1) } )"]; - 69 [label="Stub" style="filled" fillcolor=gray]; - 70 [label="Exit function test_4" style="filled" fillcolor=red]; + 70 [label="Stub" style="filled" fillcolor=gray]; + 60 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 59 -> {60}; - 60 -> {61}; - 60 -> {66} [color=red]; - 61 -> {65 62}; - 62 -> {63}; - 63 -> {70}; - 63 -> {64} [style=dotted]; - 64 -> {65} [style=dotted]; - 65 -> {61}; - 65 -> {66} [color=green]; - 66 -> {67}; - 67 -> {68}; - 68 -> {70}; - 68 -> {69} [style=dotted]; + 59 -> {61}; + 61 -> {63}; + 61 -> {62} [color=red]; + 62 -> {68}; + 63 -> {64 65}; + 64 -> {63}; + 64 -> {62} [color=green]; + 65 -> {66}; + 66 -> {60}; + 66 -> {67} [style=dotted]; + 67 -> {64} [style=dotted]; + 68 -> {69}; + 69 -> {60}; 69 -> {70} [style=dotted]; + 70 -> {60} [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 01973abd175..0300bcdf306 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot @@ -6,127 +6,126 @@ digraph localClassesWithImplicit_kt { subgraph cluster_0 { color=red 0 [label="Enter function myRun" style="filled" fillcolor=red]; - 1 [label="Function call: R|/block|.R|FakeOverride|()"]; - 2 [label="Jump: ^myRun R|/block|.R|FakeOverride|()"]; - 3 [label="Stub" style="filled" fillcolor=gray]; - 4 [label="Exit 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]; + 1 [label="Exit function myRun" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {4}; - 2 -> {3} [style=dotted]; + 0 -> {2}; + 2 -> {3}; + 3 -> {1}; 3 -> {4} [style=dotted]; + 4 -> {1} [style=dotted]; subgraph cluster_1 { color=red 5 [label="Enter function test" style="filled" fillcolor=red]; subgraph cluster_2 { color=blue - 6 [label="Enter when"]; + 7 [label="Enter when"]; subgraph cluster_3 { color=blue - 7 [label="Enter when branch condition "]; - 8 [label="Access variable R|/a|"]; - 9 [label="Type operator: (R|/a| !is R|kotlin/String|)"]; - 10 [label="Exit when branch condition"]; + 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"]; } - 11 [label="Synthetic else branch"]; - 12 [label="Enter when branch result"]; + 19 [label="Synthetic else branch"]; + 13 [label="Enter when branch result"]; subgraph cluster_4 { color=blue - 13 [label="Enter block"]; - 14 [label="Jump: ^test Unit"]; - 15 [label="Stub" style="filled" fillcolor=gray]; - 16 [label="Exit block" style="filled" fillcolor=gray]; + 14 [label="Enter block"]; + 15 [label="Jump: ^test Unit"]; + 16 [label="Stub" style="filled" fillcolor=gray]; + 17 [label="Exit block" style="filled" fillcolor=gray]; } - 17 [label="Exit when branch result" style="filled" fillcolor=gray]; - 18 [label="Exit when"]; + 18 [label="Exit when branch result" style="filled" fillcolor=gray]; + 8 [label="Exit when"]; } - 19 [label="Exit local class test"]; - 20 [label="Exit anonymous object"]; - 21 [label="Variable declaration: lval x: R|anonymous|"]; - 22 [label="Exit function test" style="filled" fillcolor=red]; + 20 [label="Exit local class test"]; + 21 [label="Exit anonymous object"]; + 22 [label="Variable declaration: lval x: R|anonymous|"]; + 6 [label="Exit function test" style="filled" fillcolor=red]; } - - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; - 8 -> {9}; + 5 -> {7}; + 7 -> {9}; + 8 -> {20}; + 8 -> {23 26 57 71} [color=red]; 9 -> {10}; - 10 -> {12 11}; - 11 -> {18}; - 12 -> {13}; + 10 -> {11}; + 11 -> {12}; + 12 -> {13 19}; 13 -> {14}; - 14 -> {22}; - 14 -> {15} [style=dotted]; + 14 -> {15}; + 15 -> {6}; 15 -> {16} [style=dotted]; 16 -> {17} [style=dotted]; 17 -> {18} [style=dotted]; - 18 -> {19}; - 19 -> {20}; + 18 -> {8} [style=dotted]; + 19 -> {8}; 20 -> {21}; + 20 -> {78 81 112 126} [color=red]; 21 -> {22}; + 22 -> {6}; subgraph cluster_5 { color=red 23 [label="Enter function " style="filled" fillcolor=red]; - 24 [label="Delegated constructor call: super()"]; - 25 [label="Exit function " style="filled" fillcolor=red]; + 25 [label="Delegated constructor call: super()"]; + 24 [label="Exit function " style="filled" fillcolor=red]; } - - 23 -> {24}; - 24 -> {25}; + 23 -> {25}; + 25 -> {24}; subgraph cluster_6 { color=red 26 [label="Enter function foo" style="filled" fillcolor=red]; - 27 [label="Postponed enter to lambda"]; + 28 [label="Postponed enter to lambda"]; subgraph cluster_7 { color=blue - 28 [label="Enter function anonymousFunction"]; - 29 [label="Access variable R|/a|"]; - 30 [label="Access variable R|kotlin/String.length|"]; + 30 [label="Enter function anonymousFunction"]; + 32 [label="Access variable R|/a|"]; + 33 [label="Access variable R|kotlin/String.length|"]; subgraph cluster_8 { color=blue - 31 [label="Enter when"]; + 34 [label="Enter when"]; subgraph cluster_9 { color=blue - 32 [label="Enter when branch condition "]; - 33 [label="Access variable R|/b|"]; - 34 [label="Type operator: (R|/b| is R|kotlin/String|)"]; - 35 [label="Exit when branch condition"]; + 36 [label="Enter when branch condition "]; + 37 [label="Access variable R|/b|"]; + 38 [label="Type operator: (R|/b| is R|kotlin/String|)"]; + 39 [label="Exit when branch condition"]; } subgraph cluster_10 { color=blue - 36 [label="Enter when branch condition else"]; - 37 [label="Exit when branch condition"]; + 47 [label="Enter when branch condition else"]; + 48 [label="Exit when branch condition"]; } - 38 [label="Enter when branch result"]; + 49 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 39 [label="Enter block"]; - 40 [label="Const: Int(1)"]; - 41 [label="Exit block"]; + 50 [label="Enter block"]; + 51 [label="Const: Int(1)"]; + 52 [label="Exit block"]; } - 42 [label="Exit when branch result"]; - 43 [label="Enter when branch result"]; + 53 [label="Exit when branch result"]; + 40 [label="Enter when branch result"]; subgraph cluster_12 { 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"]; + 41 [label="Enter block"]; + 42 [label="Access variable R|/b|"]; + 43 [label="Access variable R|kotlin/String.length|"]; + 44 [label="Function call: this@R|/A|.R|/A.bar|()"]; + 45 [label="Exit block"]; } - 49 [label="Exit when branch result"]; - 50 [label="Exit when"]; + 46 [label="Exit when branch result"]; + 35 [label="Exit when"]; } - 51 [label="Exit function anonymousFunction"]; + 31 [label="Exit function anonymousFunction"]; } - 52 [label="Postponed exit from lambda"]; - 53 [label="Function call: R|/myRun|(...)"]; - 54 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 29 [label="Postponed exit from lambda"]; + 54 [label="Function call: R|/myRun|(...)"]; + 55 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| ^ when () { (R|/b| is R|kotlin/String|) -> { @@ -140,169 +139,164 @@ digraph localClassesWithImplicit_kt { } )"]; - 55 [label="Stub" style="filled" fillcolor=gray]; - 56 [label="Exit function foo" style="filled" fillcolor=red]; + 56 [label="Stub" style="filled" fillcolor=gray]; + 27 [label="Exit function foo" style="filled" fillcolor=red]; } - - 26 -> {27}; - 27 -> {28}; - 27 -> {52} [color=red]; - 28 -> {51 29}; - 29 -> {30}; - 30 -> {31}; - 31 -> {32}; + 26 -> {28}; + 28 -> {30}; + 28 -> {29} [color=red]; + 29 -> {54}; + 30 -> {31 32}; + 31 -> {30}; + 31 -> {29} [color=green]; 32 -> {33}; 33 -> {34}; - 34 -> {35}; - 35 -> {43 36}; + 34 -> {36}; + 35 -> {31}; 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {40}; + 39 -> {40 47}; 40 -> {41}; 41 -> {42}; - 42 -> {50}; + 42 -> {43}; 43 -> {44}; 44 -> {45}; 45 -> {46}; - 46 -> {47}; + 46 -> {35}; 47 -> {48}; 48 -> {49}; 49 -> {50}; 50 -> {51}; - 51 -> {28}; - 51 -> {52} [color=green]; + 51 -> {52}; 52 -> {53}; - 53 -> {54}; - 54 -> {56}; - 54 -> {55} [style=dotted]; + 53 -> {35}; + 54 -> {55}; + 55 -> {27}; 55 -> {56} [style=dotted]; + 56 -> {27} [style=dotted]; subgraph cluster_13 { color=red 57 [label="Enter function bar" style="filled" fillcolor=red]; - 58 [label="Postponed enter to lambda"]; + 59 [label="Postponed enter to lambda"]; subgraph cluster_14 { color=blue - 59 [label="Enter function anonymousFunction"]; - 60 [label="Access variable R|/b|"]; - 61 [label="Access variable #"]; - 62 [label="Access variable R|/a|"]; - 63 [label="Access variable R|kotlin/String.length|"]; - 64 [label="Function call: this@R|/A|.R|/A.baz|()"]; - 65 [label="Exit function anonymousFunction"]; + 61 [label="Enter function anonymousFunction"]; + 63 [label="Access variable R|/b|"]; + 64 [label="Access variable #"]; + 65 [label="Access variable R|/a|"]; + 66 [label="Access variable R|kotlin/String.length|"]; + 67 [label="Function call: this@R|/A|.R|/A.baz|()"]; + 62 [label="Exit function anonymousFunction"]; } - 66 [label="Postponed exit from lambda"]; - 67 [label="Function call: R|/myRun|(...)"]; - 68 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 60 [label="Postponed exit from lambda"]; + 68 [label="Function call: R|/myRun|(...)"]; + 69 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/b|.# R|/a|.R|kotlin/String.length| ^ this@R|/A|.R|/A.baz|() } )"]; - 69 [label="Stub" style="filled" fillcolor=gray]; - 70 [label="Exit function bar" style="filled" fillcolor=red]; + 70 [label="Stub" style="filled" fillcolor=gray]; + 58 [label="Exit function bar" style="filled" fillcolor=red]; } - - 57 -> {58}; - 58 -> {59}; - 58 -> {66} [color=red]; - 59 -> {65 60}; - 60 -> {61}; - 61 -> {62}; - 62 -> {63}; + 57 -> {59}; + 59 -> {61}; + 59 -> {60} [color=red]; + 60 -> {68}; + 61 -> {62 63}; + 62 -> {61}; + 62 -> {60} [color=green]; 63 -> {64}; 64 -> {65}; - 65 -> {59}; - 65 -> {66} [color=green]; + 65 -> {66}; 66 -> {67}; - 67 -> {68}; - 68 -> {70}; - 68 -> {69} [style=dotted]; + 67 -> {62}; + 68 -> {69}; + 69 -> {58}; 69 -> {70} [style=dotted]; + 70 -> {58} [style=dotted]; subgraph cluster_15 { color=red 71 [label="Enter function baz" style="filled" fillcolor=red]; - 72 [label="Const: Int(1)"]; - 73 [label="Jump: ^baz Int(1)"]; - 74 [label="Stub" style="filled" fillcolor=gray]; - 75 [label="Exit 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]; } - - 71 -> {72}; - 72 -> {73}; - 73 -> {75}; - 73 -> {74} [style=dotted]; + 71 -> {73}; + 73 -> {74}; + 74 -> {72}; 74 -> {75} [style=dotted]; + 75 -> {72} [style=dotted]; subgraph cluster_16 { 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]; - 79 [label="Delegated constructor call: super()"]; - 80 [label="Exit function " style="filled" fillcolor=red]; + 80 [label="Delegated constructor call: super()"]; + 79 [label="Exit function " style="filled" fillcolor=red]; } - - 78 -> {79}; - 79 -> {80}; + 78 -> {80}; + 80 -> {79}; subgraph cluster_18 { color=red 81 [label="Enter function foo" style="filled" fillcolor=red]; - 82 [label="Postponed enter to lambda"]; + 83 [label="Postponed enter to lambda"]; subgraph cluster_19 { color=blue - 83 [label="Enter function anonymousFunction"]; - 84 [label="Access variable R|/a|"]; - 85 [label="Access variable R|kotlin/String.length|"]; + 85 [label="Enter function anonymousFunction"]; + 87 [label="Access variable R|/a|"]; + 88 [label="Access variable R|kotlin/String.length|"]; subgraph cluster_20 { color=blue - 86 [label="Enter when"]; + 89 [label="Enter when"]; subgraph cluster_21 { color=blue - 87 [label="Enter when branch condition "]; - 88 [label="Access variable R|/b|"]; - 89 [label="Type operator: (R|/b| is R|kotlin/String|)"]; - 90 [label="Exit when branch condition"]; + 91 [label="Enter when branch condition "]; + 92 [label="Access variable R|/b|"]; + 93 [label="Type operator: (R|/b| is R|kotlin/String|)"]; + 94 [label="Exit when branch condition"]; } subgraph cluster_22 { color=blue - 91 [label="Enter when branch condition else"]; - 92 [label="Exit when branch condition"]; + 102 [label="Enter when branch condition else"]; + 103 [label="Exit when branch condition"]; } - 93 [label="Enter when branch result"]; + 104 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 94 [label="Enter block"]; - 95 [label="Const: Int(1)"]; - 96 [label="Exit block"]; + 105 [label="Enter block"]; + 106 [label="Const: Int(1)"]; + 107 [label="Exit block"]; } - 97 [label="Exit when branch result"]; - 98 [label="Enter when branch result"]; + 108 [label="Exit when branch result"]; + 95 [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|/anonymous|.R|/anonymous.bar|()"]; - 103 [label="Exit block"]; + 96 [label="Enter block"]; + 97 [label="Access variable R|/b|"]; + 98 [label="Access variable R|kotlin/String.length|"]; + 99 [label="Function call: this@R|/anonymous|.R|/anonymous.bar|()"]; + 100 [label="Exit block"]; } - 104 [label="Exit when branch result"]; - 105 [label="Exit when"]; + 101 [label="Exit when branch result"]; + 90 [label="Exit when"]; } - 106 [label="Exit function anonymousFunction"]; + 86 [label="Exit function anonymousFunction"]; } - 107 [label="Postponed exit from lambda"]; - 108 [label="Function call: R|/myRun|(...)"]; - 109 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 84 [label="Postponed exit from lambda"]; + 109 [label="Function call: R|/myRun|(...)"]; + 110 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| ^ when () { (R|/b| is R|kotlin/String|) -> { @@ -316,108 +310,104 @@ digraph localClassesWithImplicit_kt { } )"]; - 110 [label="Stub" style="filled" fillcolor=gray]; - 111 [label="Exit function foo" style="filled" fillcolor=red]; + 111 [label="Stub" style="filled" fillcolor=gray]; + 82 [label="Exit function foo" style="filled" fillcolor=red]; } - - 81 -> {82}; - 82 -> {83}; - 82 -> {107} [color=red]; - 83 -> {106 84}; - 84 -> {85}; - 85 -> {86}; - 86 -> {87}; + 81 -> {83}; + 83 -> {85}; + 83 -> {84} [color=red]; + 84 -> {109}; + 85 -> {86 87}; + 86 -> {85}; + 86 -> {84} [color=green]; 87 -> {88}; 88 -> {89}; - 89 -> {90}; - 90 -> {98 91}; + 89 -> {91}; + 90 -> {86}; 91 -> {92}; 92 -> {93}; 93 -> {94}; - 94 -> {95}; + 94 -> {95 102}; 95 -> {96}; 96 -> {97}; - 97 -> {105}; + 97 -> {98}; 98 -> {99}; 99 -> {100}; 100 -> {101}; - 101 -> {102}; + 101 -> {90}; 102 -> {103}; 103 -> {104}; 104 -> {105}; 105 -> {106}; - 106 -> {83}; - 106 -> {107} [color=green]; + 106 -> {107}; 107 -> {108}; - 108 -> {109}; - 109 -> {111}; - 109 -> {110} [style=dotted]; + 108 -> {90}; + 109 -> {110}; + 110 -> {82}; 110 -> {111} [style=dotted]; + 111 -> {82} [style=dotted]; subgraph cluster_25 { color=red 112 [label="Enter function bar" style="filled" fillcolor=red]; - 113 [label="Postponed enter to lambda"]; + 114 [label="Postponed enter to lambda"]; subgraph cluster_26 { color=blue - 114 [label="Enter function anonymousFunction"]; - 115 [label="Access variable R|/a|"]; - 116 [label="Access variable R|kotlin/String.length|"]; - 117 [label="Access variable R|/b|"]; - 118 [label="Access variable #"]; - 119 [label="Function call: this@R|/anonymous|.R|/anonymous.baz|()"]; - 120 [label="Exit function anonymousFunction"]; + 116 [label="Enter function anonymousFunction"]; + 118 [label="Access variable R|/a|"]; + 119 [label="Access variable R|kotlin/String.length|"]; + 120 [label="Access variable R|/b|"]; + 121 [label="Access variable #"]; + 122 [label="Function call: this@R|/anonymous|.R|/anonymous.baz|()"]; + 117 [label="Exit function anonymousFunction"]; } - 121 [label="Postponed exit from lambda"]; - 122 [label="Function call: R|/myRun|(...)"]; - 123 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 115 [label="Postponed exit from lambda"]; + 123 [label="Function call: R|/myRun|(...)"]; + 124 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| R|/b|.# ^ this@R|/anonymous|.R|/anonymous.baz|() } )"]; - 124 [label="Stub" style="filled" fillcolor=gray]; - 125 [label="Exit function bar" style="filled" fillcolor=red]; + 125 [label="Stub" style="filled" fillcolor=gray]; + 113 [label="Exit function bar" style="filled" fillcolor=red]; } - - 112 -> {113}; - 113 -> {114}; - 113 -> {121} [color=red]; - 114 -> {120 115}; - 115 -> {116}; - 116 -> {117}; - 117 -> {118}; + 112 -> {114}; + 114 -> {116}; + 114 -> {115} [color=red]; + 115 -> {123}; + 116 -> {117 118}; + 117 -> {116}; + 117 -> {115} [color=green]; 118 -> {119}; 119 -> {120}; - 120 -> {114}; - 120 -> {121} [color=green]; + 120 -> {121}; 121 -> {122}; - 122 -> {123}; - 123 -> {125}; - 123 -> {124} [style=dotted]; + 122 -> {117}; + 123 -> {124}; + 124 -> {113}; 124 -> {125} [style=dotted]; + 125 -> {113} [style=dotted]; subgraph cluster_27 { color=red 126 [label="Enter function baz" style="filled" fillcolor=red]; - 127 [label="Const: Int(1)"]; - 128 [label="Jump: ^baz Int(1)"]; - 129 [label="Stub" style="filled" fillcolor=gray]; - 130 [label="Exit 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]; } - - 126 -> {127}; - 127 -> {128}; - 128 -> {130}; - 128 -> {129} [style=dotted]; + 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]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/loops.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/loops.dot index 38e4cde054e..0ccf8b14c58 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/loops.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/loops.dot @@ -8,85 +8,82 @@ digraph loops_kt { 0 [label="Enter function testWhile" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter while loop"]; + 2 [label="Enter while loop"]; subgraph cluster_2 { color=blue - 2 [label="Enter loop condition"]; - 3 [label="Access variable R|/b|"]; - 4 [label="Exit loop condition"]; + 4 [label="Enter loop condition"]; + 5 [label="Access variable R|/b|"]; + 6 [label="Exit loop condition"]; } subgraph cluster_3 { color=blue - 5 [label="Enter loop block"]; + 7 [label="Enter loop block"]; subgraph cluster_4 { color=blue - 6 [label="Enter block"]; - 7 [label="Access variable R|/x|"]; - 8 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 9 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; - 10 [label="Exit block"]; + 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"]; } - 11 [label="Exit loop block"]; + 13 [label="Exit loop block"]; } - 12 [label="Exit whileloop"]; + 3 [label="Exit whileloop"]; } - 13 [label="Access variable R|/x|"]; - 14 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 15 [label="Exit function testWhile" style="filled" fillcolor=red]; + 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 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; - 4 -> {12 5}; + 0 -> {2}; + 2 -> {4}; + 3 -> {14}; + 4 -> {5}; 5 -> {6}; - 6 -> {7}; + 6 -> {3 7}; 7 -> {8}; 8 -> {9}; 9 -> {10}; 10 -> {11}; - 11 -> {2}; + 11 -> {12}; 12 -> {13}; - 13 -> {14}; + 13 -> {4}; 14 -> {15}; + 15 -> {1}; subgraph cluster_5 { color=red 16 [label="Enter function testDoWhile" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 17 [label="Enter do-while loop"]; + 18 [label="Enter do-while loop"]; subgraph cluster_7 { color=blue - 18 [label="Enter loop block"]; + 20 [label="Enter loop block"]; subgraph cluster_8 { color=blue - 19 [label="Enter block"]; - 20 [label="Access variable R|/x|"]; - 21 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 22 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; - 23 [label="Exit block"]; + 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"]; } - 24 [label="Exit loop block"]; + 26 [label="Exit loop block"]; } subgraph cluster_9 { color=blue - 25 [label="Enter loop condition"]; - 26 [label="Access variable R|/b|"]; - 27 [label="Exit loop condition"]; + 27 [label="Enter loop condition"]; + 28 [label="Access variable R|/b|"]; + 29 [label="Exit loop condition"]; } - 28 [label="Exit do-whileloop"]; + 19 [label="Exit do-whileloop"]; } - 29 [label="Access variable R|/x|"]; - 30 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 31 [label="Exit function testDoWhile" style="filled" fillcolor=red]; + 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]; } - - 16 -> {17}; - 17 -> {18}; - 18 -> {19}; - 19 -> {20}; + 16 -> {18}; + 18 -> {20}; + 19 -> {30}; 20 -> {21}; 21 -> {22}; 22 -> {23}; @@ -94,65 +91,64 @@ digraph loops_kt { 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {18 28}; + 27 -> {28}; 28 -> {29}; - 29 -> {30}; + 29 -> {20 19}; 30 -> {31}; + 31 -> {17}; subgraph cluster_10 { color=red 32 [label="Enter function testFor" style="filled" fillcolor=red]; - 33 [label="Const: Int(0)"]; - 34 [label="Const: Int(5)"]; - 35 [label="Function call: Int(0).R|kotlin/Int.rangeTo|(...)"]; - 36 [label="Function call: Int(0).R|kotlin/Int.rangeTo|(...).R|kotlin/ranges/IntProgression.iterator|()"]; - 37 [label="Variable declaration: lval : R|kotlin/collections/IntIterator|"]; + 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 - 38 [label="Enter while loop"]; + 39 [label="Enter while loop"]; subgraph cluster_12 { color=blue - 39 [label="Enter loop condition"]; - 40 [label="Access variable R|/|"]; - 41 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 42 [label="Exit loop condition"]; + 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 - 43 [label="Enter loop block"]; + 45 [label="Enter loop block"]; subgraph cluster_14 { color=blue - 44 [label="Enter block"]; - 45 [label="Access variable R|/|"]; - 46 [label="Function call: R|/|.R|kotlin/collections/IntIterator.next|()"]; - 47 [label="Variable declaration: lval i: R|kotlin/Int|"]; - 48 [label="Access variable R|/x|"]; - 49 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 50 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; - 51 [label="Exit block"]; + 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"]; } - 52 [label="Exit loop block"]; + 54 [label="Exit loop block"]; } - 53 [label="Exit whileloop"]; + 40 [label="Exit whileloop"]; } - 54 [label="Access variable R|/x|"]; - 55 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 56 [label="Exit function testFor" style="filled" fillcolor=red]; + 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 -> {33}; - 33 -> {34}; + 32 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {40}; - 40 -> {41}; + 39 -> {41}; + 40 -> {55}; 41 -> {42}; - 42 -> {53 43}; + 42 -> {43}; 43 -> {44}; - 44 -> {45}; + 44 -> {40 45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; @@ -160,331 +156,326 @@ digraph loops_kt { 49 -> {50}; 50 -> {51}; 51 -> {52}; - 52 -> {39}; + 52 -> {53}; 53 -> {54}; - 54 -> {55}; + 54 -> {41}; 55 -> {56}; + 56 -> {33}; subgraph cluster_15 { color=red 57 [label="Enter function testWhileTrue" style="filled" fillcolor=red]; subgraph cluster_16 { color=blue - 58 [label="Enter while loop"]; + 59 [label="Enter while loop"]; subgraph cluster_17 { color=blue - 59 [label="Enter loop condition"]; - 60 [label="Const: Boolean(true)"]; - 61 [label="Exit loop condition"]; + 61 [label="Enter loop condition"]; + 62 [label="Const: Boolean(true)"]; + 63 [label="Exit loop condition"]; } subgraph cluster_18 { color=blue - 62 [label="Enter loop block"]; + 64 [label="Enter loop block"]; subgraph cluster_19 { color=blue - 63 [label="Enter block"]; - 64 [label="Const: Int(1)"]; - 65 [label="Exit block"]; + 65 [label="Enter block"]; + 66 [label="Const: Int(1)"]; + 67 [label="Exit block"]; } - 66 [label="Exit loop block"]; + 68 [label="Exit loop block"]; } - 67 [label="Exit whileloop" style="filled" fillcolor=gray]; + 60 [label="Exit whileloop" style="filled" fillcolor=gray]; } - 68 [label="Const: Int(1)" style="filled" fillcolor=gray]; - 69 [label="Exit function testWhileTrue" style="filled" fillcolor=red 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 -> {58}; - 58 -> {59}; - 59 -> {60}; - 60 -> {61}; + 57 -> {59}; + 59 -> {61}; + 60 -> {69} [style=dotted]; 61 -> {62}; - 61 -> {67} [style=dotted]; 62 -> {63}; 63 -> {64}; + 63 -> {60} [style=dotted]; 64 -> {65}; 65 -> {66}; - 66 -> {59}; - 67 -> {68} [style=dotted]; - 68 -> {69} [style=dotted]; + 66 -> {67}; + 67 -> {68}; + 68 -> {61}; + 69 -> {58} [style=dotted]; subgraph cluster_20 { color=red 70 [label="Enter function testWhileTrueWithBreak" style="filled" fillcolor=red]; subgraph cluster_21 { color=blue - 71 [label="Enter while loop"]; + 72 [label="Enter while loop"]; subgraph cluster_22 { color=blue - 72 [label="Enter loop condition"]; - 73 [label="Const: Boolean(true)"]; - 74 [label="Exit loop condition"]; + 74 [label="Enter loop condition"]; + 75 [label="Const: Boolean(true)"]; + 76 [label="Exit loop condition"]; } subgraph cluster_23 { color=blue - 75 [label="Enter loop block"]; + 77 [label="Enter loop block"]; subgraph cluster_24 { color=blue - 76 [label="Enter block"]; + 78 [label="Enter block"]; subgraph cluster_25 { color=blue - 77 [label="Enter when"]; + 79 [label="Enter when"]; subgraph cluster_26 { color=blue - 78 [label="Enter when branch condition "]; - 79 [label="Access variable R|/b|"]; - 80 [label="Exit when branch condition"]; + 81 [label="Enter when branch condition "]; + 82 [label="Access variable R|/b|"]; + 83 [label="Exit when branch condition"]; } - 81 [label="Synthetic else branch"]; - 82 [label="Enter when branch result"]; + 90 [label="Synthetic else branch"]; + 84 [label="Enter when branch result"]; subgraph cluster_27 { color=blue - 83 [label="Enter block"]; - 84 [label="Jump: break@@@[Boolean(true)] "]; - 85 [label="Stub" style="filled" fillcolor=gray]; - 86 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 87 [label="Exit when branch result" style="filled" fillcolor=gray]; - 88 [label="Exit when"]; + 89 [label="Exit when branch result" style="filled" fillcolor=gray]; + 80 [label="Exit when"]; } - 89 [label="Exit block"]; + 91 [label="Exit block"]; } - 90 [label="Exit loop block"]; + 92 [label="Exit loop block"]; } - 91 [label="Exit whileloop"]; + 73 [label="Exit whileloop"]; } - 92 [label="Const: Int(1)"]; - 93 [label="Exit function testWhileTrueWithBreak" style="filled" fillcolor=red]; + 93 [label="Const: Int(1)"]; + 71 [label="Exit function testWhileTrueWithBreak" style="filled" fillcolor=red]; } - - 70 -> {71}; - 71 -> {72}; - 72 -> {73}; - 73 -> {74}; + 70 -> {72}; + 72 -> {74}; + 73 -> {93}; 74 -> {75}; - 74 -> {91} [style=dotted]; 75 -> {76}; 76 -> {77}; + 76 -> {73} [style=dotted]; 77 -> {78}; 78 -> {79}; - 79 -> {80}; - 80 -> {82 81}; - 81 -> {88}; + 79 -> {81}; + 80 -> {91}; + 81 -> {82}; 82 -> {83}; - 83 -> {84}; - 84 -> {91}; - 84 -> {85} [style=dotted]; - 85 -> {86} [style=dotted]; + 83 -> {84 90}; + 84 -> {85}; + 85 -> {86}; + 86 -> {73}; 86 -> {87} [style=dotted]; 87 -> {88} [style=dotted]; - 88 -> {89}; - 89 -> {90}; - 90 -> {72}; + 88 -> {89} [style=dotted]; + 89 -> {80} [style=dotted]; + 90 -> {80}; 91 -> {92}; - 92 -> {93}; + 92 -> {74}; + 93 -> {71}; subgraph cluster_28 { color=red 94 [label="Enter function testWhileFalse" style="filled" fillcolor=red]; subgraph cluster_29 { color=blue - 95 [label="Enter while loop"]; + 96 [label="Enter while loop"]; subgraph cluster_30 { color=blue - 96 [label="Enter loop condition"]; - 97 [label="Const: Boolean(false)"]; - 98 [label="Exit loop condition"]; + 98 [label="Enter loop condition"]; + 99 [label="Const: Boolean(false)"]; + 100 [label="Exit loop condition"]; } subgraph cluster_31 { color=blue - 99 [label="Enter loop block" style="filled" fillcolor=gray]; + 101 [label="Enter loop block" style="filled" fillcolor=gray]; subgraph cluster_32 { color=blue - 100 [label="Enter block" style="filled" fillcolor=gray]; - 101 [label="Const: Int(1)" style="filled" fillcolor=gray]; - 102 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 103 [label="Exit loop block" style="filled" fillcolor=gray]; + 105 [label="Exit loop block" style="filled" fillcolor=gray]; } - 104 [label="Exit whileloop"]; + 97 [label="Exit whileloop"]; } - 105 [label="Const: Int(1)"]; - 106 [label="Exit function testWhileFalse" style="filled" fillcolor=red]; + 106 [label="Const: Int(1)"]; + 95 [label="Exit function testWhileFalse" style="filled" fillcolor=red]; } - - 94 -> {95}; - 95 -> {96}; - 96 -> {97}; - 97 -> {98}; - 98 -> {104}; - 98 -> {99} [style=dotted]; - 99 -> {100} [style=dotted]; + 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 -> {96} [style=dotted]; - 104 -> {105}; - 105 -> {106}; + 103 -> {104} [style=dotted]; + 104 -> {105} [style=dotted]; + 105 -> {98} [style=dotted]; + 106 -> {95}; subgraph cluster_33 { color=red 107 [label="Enter function testDoWhileTrue" style="filled" fillcolor=red]; subgraph cluster_34 { color=blue - 108 [label="Enter do-while loop"]; + 109 [label="Enter do-while loop"]; subgraph cluster_35 { color=blue - 109 [label="Enter loop block"]; + 111 [label="Enter loop block"]; subgraph cluster_36 { color=blue - 110 [label="Enter block"]; - 111 [label="Const: Int(1)"]; - 112 [label="Exit block"]; + 112 [label="Enter block"]; + 113 [label="Const: Int(1)"]; + 114 [label="Exit block"]; } - 113 [label="Exit loop block"]; + 115 [label="Exit loop block"]; } subgraph cluster_37 { color=blue - 114 [label="Enter loop condition"]; - 115 [label="Const: Boolean(true)"]; - 116 [label="Exit loop condition"]; + 116 [label="Enter loop condition"]; + 117 [label="Const: Boolean(true)"]; + 118 [label="Exit loop condition"]; } - 117 [label="Exit do-whileloop" style="filled" fillcolor=gray]; + 110 [label="Exit do-whileloop" style="filled" fillcolor=gray]; } - 118 [label="Const: Int(1)" style="filled" fillcolor=gray]; - 119 [label="Exit function testDoWhileTrue" style="filled" fillcolor=red 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 -> {108}; - 108 -> {109}; - 109 -> {110}; - 110 -> {111}; + 107 -> {109}; + 109 -> {111}; + 110 -> {119} [style=dotted]; 111 -> {112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; - 116 -> {109}; - 116 -> {117} [style=dotted]; - 117 -> {118} [style=dotted]; - 118 -> {119} [style=dotted]; + 116 -> {117}; + 117 -> {118}; + 118 -> {111}; + 118 -> {110} [style=dotted]; + 119 -> {108} [style=dotted]; subgraph cluster_38 { color=red 120 [label="Enter function testDoWhileTrueWithBreak" style="filled" fillcolor=red]; subgraph cluster_39 { color=blue - 121 [label="Enter do-while loop"]; + 122 [label="Enter do-while loop"]; subgraph cluster_40 { color=blue - 122 [label="Enter loop block"]; + 124 [label="Enter loop block"]; subgraph cluster_41 { color=blue - 123 [label="Enter block"]; + 125 [label="Enter block"]; subgraph cluster_42 { color=blue - 124 [label="Enter when"]; + 126 [label="Enter when"]; subgraph cluster_43 { color=blue - 125 [label="Enter when branch condition "]; - 126 [label="Access variable R|/b|"]; - 127 [label="Exit when branch condition"]; + 128 [label="Enter when branch condition "]; + 129 [label="Access variable R|/b|"]; + 130 [label="Exit when branch condition"]; } - 128 [label="Synthetic else branch"]; - 129 [label="Enter when branch result"]; + 137 [label="Synthetic else branch"]; + 131 [label="Enter when branch result"]; subgraph cluster_44 { color=blue - 130 [label="Enter block"]; - 131 [label="Jump: break@@@[Boolean(true)] "]; - 132 [label="Stub" style="filled" fillcolor=gray]; - 133 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 134 [label="Exit when branch result" style="filled" fillcolor=gray]; - 135 [label="Exit when"]; + 136 [label="Exit when branch result" style="filled" fillcolor=gray]; + 127 [label="Exit when"]; } - 136 [label="Exit block"]; + 138 [label="Exit block"]; } - 137 [label="Exit loop block"]; + 139 [label="Exit loop block"]; } subgraph cluster_45 { color=blue - 138 [label="Enter loop condition"]; - 139 [label="Const: Boolean(true)"]; - 140 [label="Exit loop condition"]; + 140 [label="Enter loop condition"]; + 141 [label="Const: Boolean(true)"]; + 142 [label="Exit loop condition"]; } - 141 [label="Exit do-whileloop"]; + 123 [label="Exit do-whileloop"]; } - 142 [label="Const: Int(1)"]; - 143 [label="Exit function testDoWhileTrueWithBreak" style="filled" fillcolor=red]; + 143 [label="Const: Int(1)"]; + 121 [label="Exit function testDoWhileTrueWithBreak" style="filled" fillcolor=red]; } - - 120 -> {121}; - 121 -> {122}; - 122 -> {123}; - 123 -> {124}; + 120 -> {122}; + 122 -> {124}; + 123 -> {143}; 124 -> {125}; 125 -> {126}; - 126 -> {127}; - 127 -> {129 128}; - 128 -> {135}; + 126 -> {128}; + 127 -> {138}; + 128 -> {129}; 129 -> {130}; - 130 -> {131}; - 131 -> {141}; - 131 -> {132} [style=dotted]; - 132 -> {133} [style=dotted]; + 130 -> {131 137}; + 131 -> {132}; + 132 -> {133}; + 133 -> {123}; 133 -> {134} [style=dotted]; 134 -> {135} [style=dotted]; - 135 -> {136}; - 136 -> {137}; - 137 -> {138}; + 135 -> {136} [style=dotted]; + 136 -> {127} [style=dotted]; + 137 -> {127}; 138 -> {139}; 139 -> {140}; - 140 -> {122}; - 140 -> {141} [style=dotted]; + 140 -> {141}; 141 -> {142}; - 142 -> {143}; + 142 -> {124}; + 142 -> {123} [style=dotted]; + 143 -> {121}; subgraph cluster_46 { color=red 144 [label="Enter function testDoWhileFalse" style="filled" fillcolor=red]; subgraph cluster_47 { color=blue - 145 [label="Enter do-while loop"]; + 146 [label="Enter do-while loop"]; subgraph cluster_48 { color=blue - 146 [label="Enter loop block"]; + 148 [label="Enter loop block"]; subgraph cluster_49 { color=blue - 147 [label="Enter block"]; - 148 [label="Const: Int(1)"]; - 149 [label="Exit block"]; + 149 [label="Enter block"]; + 150 [label="Const: Int(1)"]; + 151 [label="Exit block"]; } - 150 [label="Exit loop block"]; + 152 [label="Exit loop block"]; } subgraph cluster_50 { color=blue - 151 [label="Enter loop condition"]; - 152 [label="Const: Boolean(false)"]; - 153 [label="Exit loop condition"]; + 153 [label="Enter loop condition"]; + 154 [label="Const: Boolean(false)"]; + 155 [label="Exit loop condition"]; } - 154 [label="Exit do-whileloop"]; + 147 [label="Exit do-whileloop"]; } - 155 [label="Const: Int(1)"]; - 156 [label="Exit function testDoWhileFalse" style="filled" fillcolor=red]; + 156 [label="Const: Int(1)"]; + 145 [label="Exit function testDoWhileFalse" style="filled" fillcolor=red]; } - - 144 -> {145}; - 145 -> {146}; - 146 -> {147}; - 147 -> {148}; + 144 -> {146}; + 146 -> {148}; + 147 -> {156}; 148 -> {149}; 149 -> {150}; 150 -> {151}; 151 -> {152}; 152 -> {153}; 153 -> {154}; - 153 -> {146} [style=dotted]; 154 -> {155}; - 155 -> {156}; + 155 -> {147}; + 155 -> {148} [style=dotted]; + 156 -> {145}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot index a75702dbf75..b5a60b809fa 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot @@ -6,97 +6,90 @@ digraph postponedLambdaInConstructor_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter class A" style="filled" fillcolor=red]; 4 [label="Exit class A" style="filled" fillcolor=red]; } - 3 -> {4} [color=green]; subgraph cluster_2 { color=red 5 [label="Enter function " style="filled" fillcolor=red]; - 6 [label="Access variable R|/s|"]; - 7 [label="Postponed enter to lambda"]; + 7 [label="Access variable R|/s|"]; + 8 [label="Postponed enter to lambda"]; subgraph cluster_3 { color=blue - 8 [label="Enter function anonymousFunction"]; - 9 [label="Postponed enter to lambda"]; - 10 [label="Postponed exit from lambda"]; + 10 [label="Enter function anonymousFunction"]; + 12 [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]; + } + 13 [label="Postponed exit from lambda"]; 11 [label="Exit function anonymousFunction"]; } - 12 [label="Postponed exit from lambda"]; - 13 [label="Function call: R|/s|.R|kotlin/let| kotlin/String|>(...)"]; - 14 [label="Call arguments union" style="filled" fillcolor=yellow]; + 9 [label="Postponed exit from lambda"]; + 14 [label="Function call: R|/s|.R|kotlin/let| kotlin/String|>(...)"]; + 16 [label="Call arguments union" style="filled" fillcolor=yellow]; 15 [label="Delegated constructor call: super(...)"]; - 16 [label="Exit function " style="filled" fillcolor=red]; + 6 [label="Exit function " style="filled" fillcolor=red]; } - - 5 -> {6}; - 6 -> {7}; + 5 -> {7}; 7 -> {8}; - 7 -> {12} [color=red]; - 8 -> {9}; - 9 -> {10 10} [color=green]; - 10 -> {11}; - 11 -> {12} [color=green]; - 11 -> {14} [color=red]; - 12 -> {13}; - 13 -> {14}; - 14 -> {15}; - 15 -> {16}; - - subgraph cluster_4 { - color=red - 17 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 18 [label="Access variable R|/it|"]; - 19 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 17 -> {18}; - 18 -> {19}; + 8 -> {10}; + 8 -> {9} [color=red]; + 9 -> {14}; + 10 -> {12}; + 11 -> {9} [color=green]; + 11 -> {16} [color=red]; + 12 -> {13 13} [color=green]; + 12 -> {17} [color=red]; + 13 -> {11}; + 14 -> {16}; + 15 -> {6}; + 16 -> {15}; + 17 -> {19}; + 19 -> {18}; subgraph cluster_5 { color=red 20 [label="Enter function getter" style="filled" fillcolor=red]; 21 [label="Exit function getter" style="filled" fillcolor=red]; } - 20 -> {21}; subgraph cluster_6 { - color=red - 22 [label="Enter property" style="filled" fillcolor=red]; - 23 [label="Access variable R|/s|"]; - 24 [label="Exit property" style="filled" fillcolor=red]; - } - - 22 -> {23}; - 23 -> {24}; - - subgraph cluster_7 { color=red 25 [label="Enter function foo" style="filled" fillcolor=red]; - 26 [label="Function call: this@R|/B|.R|/B.foo|()"]; - 27 [label="Exit 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]; } + 25 -> {27}; + 27 -> {26}; - 25 -> {26}; - 26 -> {27}; - - subgraph cluster_8 { + subgraph cluster_7 { color=red 28 [label="Enter class B" style="filled" fillcolor=red]; + 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]; } - + 28 -> {22} [color=green]; + 22 -> {24}; + 23 -> {29} [color=green]; + 24 -> {23}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.dot index 0a3becc06a5..35e911a4849 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.dot @@ -8,36 +8,34 @@ digraph postponedLambdas_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { color=red 2 [label="Enter function test" style="filled" fillcolor=red]; - 3 [label="Access variable R|/a|"]; - 4 [label="Postponed enter to lambda"]; + 4 [label="Access variable R|/a|"]; + 5 [label="Postponed enter to lambda"]; subgraph cluster_2 { color=blue - 5 [label="Enter function anonymousFunction"]; - 6 [label="Const: String()"]; - 7 [label="Exit function anonymousFunction"]; + 8 [label="Enter function anonymousFunction"]; + 10 [label="Const: String()"]; + 9 [label="Exit function anonymousFunction"]; } - 8 [label="Postponed exit from lambda"]; - 9 [label="Access variable R|/b|"]; - 10 [label="Function call: R|/foo|(...)"]; - 11 [label="Exit function test" style="filled" fillcolor=red]; + 6 [label="Postponed exit from lambda"]; + 7 [label="Access variable R|/b|"]; + 11 [label="Function call: R|/foo|(...)"]; + 3 [label="Exit function test" style="filled" fillcolor=red]; } - - 2 -> {3}; - 3 -> {4}; + 2 -> {4}; 4 -> {5}; - 4 -> {8} [color=red]; - 5 -> {7 6}; + 5 -> {8}; + 5 -> {6} [color=red]; 6 -> {7}; - 7 -> {5}; - 7 -> {8} [color=green]; - 8 -> {9}; - 9 -> {10}; - 10 -> {11}; + 7 -> {11}; + 8 -> {9 10}; + 9 -> {8}; + 9 -> {6} [color=green]; + 10 -> {9}; + 11 -> {3}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot index 6bec998d82e..de1abaae235 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot @@ -6,282 +6,274 @@ digraph propertiesAndInitBlocks_kt { subgraph cluster_0 { color=red 0 [label="Enter function run" style="filled" fillcolor=red]; - 1 [label="Function call: R|/block|.R|FakeOverride|()"]; - 2 [label="Exit function run" style="filled" fillcolor=red]; + 2 [label="Function call: R|/block|.R|FakeOverride|()"]; + 1 [label="Exit function run" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=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 5 [label="Enter property" style="filled" fillcolor=red]; - 6 [label="Const: Int(1)"]; - 7 [label="Exit property" style="filled" fillcolor=red]; + 7 [label="Const: Int(1)"]; + 6 [label="Exit property" style="filled" fillcolor=red]; } - - 5 -> {6}; - 6 -> {7}; + 5 -> {7}; + 7 -> {6}; subgraph cluster_3 { color=red 8 [label="Enter function getter" style="filled" fillcolor=red]; - 9 [label="Const: Int(1)"]; - 10 [label="Jump: ^ Int(1)"]; - 11 [label="Stub" style="filled" fillcolor=gray]; - 12 [label="Exit 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]; } - - 8 -> {9}; - 9 -> {10}; - 10 -> {12}; - 10 -> {11} [style=dotted]; + 8 -> {10}; + 10 -> {11}; + 11 -> {9}; 11 -> {12} [style=dotted]; + 12 -> {9} [style=dotted]; subgraph cluster_4 { color=red 13 [label="Enter function setter" style="filled" fillcolor=red]; - 14 [label="Const: Int(1)"]; - 15 [label="Assignmenet: F|/x2|"]; - 16 [label="Exit 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]; } - - 13 -> {14}; - 14 -> {15}; + 13 -> {15}; 15 -> {16}; + 16 -> {14}; subgraph cluster_5 { color=red 17 [label="Enter property" style="filled" fillcolor=red]; - 18 [label="Const: Int(1)"]; - 19 [label="Exit property" style="filled" fillcolor=red]; + 19 [label="Const: Int(1)"]; + 18 [label="Exit property" style="filled" fillcolor=red]; } - - 17 -> {18}; - 18 -> {19}; + 17 -> {19}; + 19 -> {18}; subgraph cluster_6 { - color=red - 20 [label="Enter function foo" style="filled" fillcolor=red]; - 21 [label="Const: Int(1)"]; - 22 [label="Const: Int(1)"]; - 23 [label="Function call: Int(1).R|kotlin/Int.plus|(...)"]; - 24 [label="Variable declaration: lval c: R|kotlin/Int|"]; - 25 [label="Function call: R|java/lang/Exception.Exception|()"]; - 26 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 27 [label="Stub" style="filled" fillcolor=gray]; - 28 [label="Exit function foo" style="filled" fillcolor=red]; - } - - 20 -> {21}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; - 24 -> {25}; - 25 -> {26}; - 26 -> {28}; - 26 -> {27} [style=dotted]; - 27 -> {28} [style=dotted]; - - subgraph cluster_7 { color=red 29 [label="Enter function " style="filled" fillcolor=red]; - 30 [label="Delegated constructor call: super()"]; - 31 [label="Exit function " style="filled" fillcolor=red]; + 31 [label="Delegated constructor call: super()"]; + 30 [label="Exit function " style="filled" fillcolor=red]; } + 29 -> {31}; + 31 -> {30}; - 29 -> {30}; - 30 -> {31}; - - subgraph cluster_8 { + subgraph cluster_7 { color=red - 32 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_9 { + 40 [label="Enter class LocalClass" style="filled" fillcolor=red]; + subgraph cluster_8 { color=blue - 33 [label="Enter block"]; - 34 [label="Function call: R|java/lang/Exception.Exception|()"]; - 35 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 36 [label="Stub" style="filled" fillcolor=gray]; - 37 [label="Const: Int(1)" style="filled" fillcolor=gray]; - 38 [label="Exit block" style="filled" fillcolor=gray]; + 32 [label="Enter init block" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 34 [label="Enter block"]; + 35 [label="Function call: R|java/lang/Exception.Exception|()"]; + 36 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 37 [label="Stub" style="filled" fillcolor=gray]; + 38 [label="Const: Int(1)" style="filled" fillcolor=gray]; + 39 [label="Exit block" style="filled" fillcolor=gray]; + } + 33 [label="Exit init block" style="filled" fillcolor=red]; } - 39 [label="Exit init block" style="filled" fillcolor=red]; + 41 [label="Exit class LocalClass" style="filled" fillcolor=red]; } - - 32 -> {33}; - 33 -> {34}; + 40 -> {32} [color=green]; + 32 -> {34}; + 33 -> {41} [color=green]; 34 -> {35}; - 35 -> {39}; - 35 -> {36} [style=dotted]; + 35 -> {36}; + 36 -> {33}; 36 -> {37} [style=dotted]; 37 -> {38} [style=dotted]; 38 -> {39} [style=dotted]; + 39 -> {33} [style=dotted]; subgraph cluster_10 { - color=red - 40 [label="Enter class LocalClass" style="filled" fillcolor=red]; - 41 [label="Exit class LocalClass" style="filled" fillcolor=red]; - } - - - subgraph cluster_11 { color=red 42 [label="Enter function getter" style="filled" fillcolor=red]; - 43 [label="Exit local class "]; - 44 [label="Exit function getter" style="filled" fillcolor=red]; + 44 [label="Exit local class "]; + 43 [label="Exit function getter" style="filled" fillcolor=red]; } + 42 -> {44}; + 42 -> {45} [color=red]; + 44 -> {43}; - 42 -> {43}; - 43 -> {44}; - - subgraph cluster_12 { + subgraph cluster_11 { color=red 45 [label="Enter function " style="filled" fillcolor=red]; - 46 [label="Delegated constructor call: super()"]; - 47 [label="Exit function " style="filled" fillcolor=red]; + 47 [label="Delegated constructor call: super()"]; + 46 [label="Exit function " style="filled" fillcolor=red]; } + 45 -> {47}; + 47 -> {46}; - 45 -> {46}; - 46 -> {47}; - - subgraph cluster_13 { + subgraph cluster_12 { color=red - 48 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_14 { + 55 [label="Enter class LocalClass" style="filled" fillcolor=red]; + subgraph cluster_13 { color=blue - 49 [label="Enter block"]; - 50 [label="Function call: R|java/lang/Exception.Exception|()"]; - 51 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 52 [label="Stub" style="filled" fillcolor=gray]; - 53 [label="Exit block" style="filled" fillcolor=gray]; + 48 [label="Enter init block" style="filled" fillcolor=red]; + subgraph cluster_14 { + color=blue + 50 [label="Enter block"]; + 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]; + } + 49 [label="Exit init block" style="filled" fillcolor=red]; } - 54 [label="Exit init block" style="filled" fillcolor=red]; + 56 [label="Exit class LocalClass" style="filled" fillcolor=red]; } - - 48 -> {49}; - 49 -> {50}; + 55 -> {48} [color=green]; + 48 -> {50}; + 49 -> {56} [color=green]; 50 -> {51}; - 51 -> {54}; - 51 -> {52} [style=dotted]; + 51 -> {52}; + 52 -> {49}; 52 -> {53} [style=dotted]; 53 -> {54} [style=dotted]; + 54 -> {49} [style=dotted]; subgraph cluster_15 { - color=red - 55 [label="Enter class LocalClass" style="filled" fillcolor=red]; - 56 [label="Exit class LocalClass" style="filled" fillcolor=red]; - } - - - subgraph cluster_16 { color=red 57 [label="Enter property" style="filled" fillcolor=red]; - 58 [label="Postponed enter to lambda"]; - subgraph cluster_17 { + 59 [label="Postponed enter to lambda"]; + subgraph cluster_16 { color=blue - 59 [label="Enter function anonymousFunction"]; - 60 [label="Exit local class val x3"]; - 61 [label="Function call: R|java/lang/Exception.Exception|()"]; - 62 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 63 [label="Stub" style="filled" fillcolor=gray]; - 64 [label="Exit function anonymousFunction"]; + 61 [label="Enter function anonymousFunction"]; + 63 [label="Exit local class val x3"]; + 64 [label="Function call: R|java/lang/Exception.Exception|()"]; + 65 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 66 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_17 { + color=blue + 29 [label="Enter function " style="filled" fillcolor=red]; + 31 [label="Delegated constructor call: super()"]; + 30 [label="Exit function " style="filled" fillcolor=red]; + } + subgraph cluster_18 { + color=blue + 20 [label="Enter function foo" style="filled" fillcolor=red]; + 22 [label="Const: Int(1)"]; + 23 [label="Const: Int(1)"]; + 24 [label="Function call: Int(1).R|kotlin/Int.plus|(...)"]; + 25 [label="Variable declaration: lval c: R|kotlin/Int|"]; + 26 [label="Function call: R|java/lang/Exception.Exception|()"]; + 27 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 28 [label="Stub" style="filled" fillcolor=gray]; + 21 [label="Exit function foo" style="filled" fillcolor=red]; + } + 62 [label="Exit function anonymousFunction"]; } - 65 [label="Postponed exit from lambda"]; - 66 [label="Function call: R|/run|(...)"]; - 67 [label="Exit property" style="filled" fillcolor=red]; + 60 [label="Postponed exit from lambda"]; + 67 [label="Function call: R|/run|(...)"]; + 58 [label="Exit property" style="filled" fillcolor=red]; } + 57 -> {59}; + 59 -> {61}; + 59 -> {60} [color=red]; + 60 -> {67}; + 61 -> {62 63}; + 61 -> {20 29} [color=red]; + 62 -> {61}; + 62 -> {60} [color=green]; + 63 -> {64}; + 64 -> {65}; + 65 -> {58}; + 65 -> {66} [style=dotted]; + 66 -> {62} [style=dotted]; + 67 -> {58}; + 20 -> {22}; + 22 -> {23}; + 23 -> {24}; + 24 -> {25}; + 25 -> {26}; + 26 -> {27}; + 27 -> {21}; + 27 -> {28} [style=dotted]; + 28 -> {21} [style=dotted]; - 57 -> {58}; - 58 -> {59}; - 58 -> {65} [color=red]; - 59 -> {64 60}; - 60 -> {61}; - 61 -> {62}; - 62 -> {67}; - 62 -> {63} [style=dotted]; - 63 -> {64} [style=dotted]; - 64 -> {59}; - 64 -> {65} [color=green]; - 65 -> {66}; - 66 -> {67}; - - subgraph cluster_18 { + subgraph cluster_19 { color=red 68 [label="Enter function getter" style="filled" fillcolor=red]; 69 [label="Exit function getter" style="filled" fillcolor=red]; } - 68 -> {69}; - subgraph cluster_19 { + subgraph cluster_20 { color=red 70 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_20 { + subgraph cluster_21 { color=blue - 71 [label="Try expression enter"]; - subgraph cluster_21 { + 72 [label="Try expression enter"]; + subgraph cluster_22 { color=blue - 72 [label="Try main block enter"]; - subgraph cluster_22 { + 74 [label="Try main block enter"]; + subgraph cluster_23 { color=blue - 73 [label="Enter block"]; - 74 [label="Const: Int(1)"]; - 75 [label="Exit block"]; + 77 [label="Enter block"]; + 78 [label="Const: Int(1)"]; + 79 [label="Exit block"]; } - 76 [label="Try main block exit"]; + 80 [label="Try main block exit"]; } - subgraph cluster_23 { + subgraph cluster_24 { color=blue - 77 [label="Enter finally"]; - subgraph cluster_24 { + 76 [label="Enter finally"]; + subgraph cluster_25 { color=blue - 78 [label="Enter block"]; - 79 [label="Const: Int(0)"]; - 80 [label="Exit block"]; + 85 [label="Enter block"]; + 86 [label="Const: Int(0)"]; + 87 [label="Exit block"]; } - 81 [label="Exit finally"]; + 88 [label="Exit finally"]; } - subgraph cluster_25 { + subgraph cluster_26 { color=blue - 82 [label="Catch enter"]; - subgraph cluster_26 { + 75 [label="Catch enter"]; + subgraph cluster_27 { color=blue - 83 [label="Enter block"]; - 84 [label="Const: Int(2)"]; - 85 [label="Exit block"]; + 81 [label="Enter block"]; + 82 [label="Const: Int(2)"]; + 83 [label="Exit block"]; } - 86 [label="Catch exit"]; + 84 [label="Catch exit"]; } - 87 [label="Try expression exit"]; + 73 [label="Try expression exit"]; } - 88 [label="Exit property" style="filled" fillcolor=red]; + 71 [label="Exit property" style="filled" fillcolor=red]; } - - 70 -> {71}; - 71 -> {72}; - 72 -> {88 82 77 73}; - 73 -> {74}; - 74 -> {75}; - 75 -> {76}; - 76 -> {87}; + 70 -> {72}; + 72 -> {74}; + 73 -> {71}; + 74 -> {71 75 76 77}; + 75 -> {71 81}; + 76 -> {85}; 77 -> {78}; 78 -> {79}; 79 -> {80}; - 80 -> {81}; - 81 -> {87}; - 82 -> {88 83}; + 80 -> {73}; + 81 -> {82}; + 82 -> {83}; 83 -> {84}; - 84 -> {85}; + 84 -> {73}; 85 -> {86}; 86 -> {87}; 87 -> {88}; + 88 -> {73}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot index 4617a446d2e..e52b8a22ab6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot @@ -8,176 +8,168 @@ digraph returnValuesFromLambda_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; subgraph cluster_1 { color=red 2 [label="Enter function " style="filled" fillcolor=red]; - 3 [label="Delegated constructor call: super()"]; - 4 [label="Exit function " style="filled" fillcolor=red]; + 4 [label="Delegated constructor call: super()"]; + 3 [label="Exit function " style="filled" fillcolor=red]; } - - 2 -> {3}; - 3 -> {4}; + 2 -> {4}; + 4 -> {3}; subgraph cluster_2 { color=red 5 [label="Enter class B" style="filled" fillcolor=red]; 6 [label="Exit class B" style="filled" fillcolor=red]; } - 5 -> {6} [color=green]; subgraph cluster_3 { color=red 7 [label="Enter function " style="filled" fillcolor=red]; - 8 [label="Delegated constructor call: super()"]; - 9 [label="Exit function " style="filled" fillcolor=red]; + 9 [label="Delegated constructor call: super()"]; + 8 [label="Exit function " style="filled" fillcolor=red]; } - - 7 -> {8}; - 8 -> {9}; + 7 -> {9}; + 9 -> {8}; subgraph cluster_4 { color=red 10 [label="Enter class C" style="filled" fillcolor=red]; 11 [label="Exit class C" style="filled" fillcolor=red]; } - 10 -> {11} [color=green]; subgraph cluster_5 { color=red 12 [label="Enter function test_1" style="filled" fillcolor=red]; - 13 [label="Postponed enter to lambda"]; + 14 [label="Postponed enter to lambda"]; subgraph cluster_6 { color=blue - 14 [label="Enter function anonymousFunction"]; + 16 [label="Enter function anonymousFunction"]; subgraph cluster_7 { color=blue - 15 [label="Enter when"]; + 18 [label="Enter when"]; subgraph cluster_8 { color=blue - 16 [label="Enter when branch condition "]; - 17 [label="Access variable R|/b|"]; - 18 [label="Exit when branch condition"]; + 20 [label="Enter when branch condition "]; + 21 [label="Access variable R|/b|"]; + 22 [label="Exit when branch condition"]; } - 19 [label="Synthetic else branch"]; - 20 [label="Enter when branch result"]; + 30 [label="Synthetic else branch"]; + 23 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 21 [label="Enter block"]; - 22 [label="Function call: R|/B.B|()"]; - 23 [label="Jump: ^@run R|/B.B|()"]; - 24 [label="Stub" style="filled" fillcolor=gray]; - 25 [label="Exit block" style="filled" fillcolor=gray]; + 24 [label="Enter block"]; + 25 [label="Function call: R|/B.B|()"]; + 26 [label="Jump: ^@run R|/B.B|()"]; + 27 [label="Stub" style="filled" fillcolor=gray]; + 28 [label="Exit block" style="filled" fillcolor=gray]; } - 26 [label="Exit when branch result" style="filled" fillcolor=gray]; - 27 [label="Exit when"]; + 29 [label="Exit when branch result" style="filled" fillcolor=gray]; + 19 [label="Exit when"]; } - 28 [label="Function call: R|/C.C|()"]; - 29 [label="Exit function anonymousFunction"]; + 31 [label="Function call: R|/C.C|()"]; + 17 [label="Exit function anonymousFunction"]; } - 30 [label="Call arguments union" style="filled" fillcolor=yellow]; - 31 [label="Postponed exit from lambda"]; + 33 [label="Call arguments union" style="filled" fillcolor=yellow]; + 15 [label="Postponed exit from lambda"]; 32 [label="Function call: R|kotlin/run|(...)"]; - 33 [label="Variable declaration: lval x: R|A|"]; - 34 [label="Exit function test_1" style="filled" fillcolor=red]; + 34 [label="Variable declaration: lval x: R|A|"]; + 13 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 12 -> {13}; - 13 -> {14}; - 13 -> {31} [color=red]; - 14 -> {15}; - 15 -> {16}; - 16 -> {17}; - 17 -> {18}; - 18 -> {20 19}; - 19 -> {27}; + 12 -> {14}; + 14 -> {16}; + 14 -> {15} [color=red]; + 15 -> {32} [color=green]; + 16 -> {18}; + 17 -> {15} [color=green]; + 17 -> {33} [color=red]; + 18 -> {20}; + 19 -> {31}; 20 -> {21}; 21 -> {22}; - 22 -> {23}; - 23 -> {29}; - 23 -> {24} [style=dotted]; - 24 -> {25} [style=dotted]; - 25 -> {26} [style=dotted]; + 22 -> {23 30}; + 23 -> {24}; + 24 -> {25}; + 25 -> {26}; + 26 -> {17}; 26 -> {27} [style=dotted]; - 27 -> {28}; - 28 -> {29}; - 29 -> {31} [color=green]; - 29 -> {30} [color=red]; - 30 -> {32} [color=red]; - 31 -> {32} [color=green]; - 32 -> {33}; - 33 -> {34}; + 27 -> {28} [style=dotted]; + 28 -> {29} [style=dotted]; + 29 -> {19} [style=dotted]; + 30 -> {19}; + 31 -> {17}; + 32 -> {34}; + 33 -> {32} [color=red]; + 34 -> {13}; subgraph cluster_10 { color=red 35 [label="Enter function test_2" style="filled" fillcolor=red]; - 36 [label="Postponed enter to lambda"]; + 37 [label="Postponed enter to lambda"]; subgraph cluster_11 { color=blue - 37 [label="Enter function anonymousFunction"]; - 38 [label="Function call: R|/C.C|()"]; - 39 [label="Jump: ^@run R|/C.C|()"]; - 40 [label="Stub" style="filled" fillcolor=gray]; - 41 [label="Exit function anonymousFunction"]; + 39 [label="Enter function anonymousFunction"]; + 41 [label="Function call: R|/C.C|()"]; + 42 [label="Jump: ^@run R|/C.C|()"]; + 43 [label="Stub" style="filled" fillcolor=gray]; + 40 [label="Exit function anonymousFunction"]; } - 42 [label="Call arguments union" style="filled" fillcolor=yellow]; - 43 [label="Postponed exit from lambda"]; + 45 [label="Call arguments union" style="filled" fillcolor=yellow]; + 38 [label="Postponed exit from lambda"]; 44 [label="Function call: R|kotlin/run|(...)"]; - 45 [label="Variable declaration: lval x: R|C|"]; - 46 [label="Exit function test_2" style="filled" fillcolor=red]; + 46 [label="Variable declaration: lval x: R|C|"]; + 36 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 35 -> {36}; - 36 -> {37}; - 36 -> {43} [color=red]; - 37 -> {38}; - 38 -> {39}; + 35 -> {37}; + 37 -> {39}; + 37 -> {38} [color=red]; + 38 -> {44} [color=green]; 39 -> {41}; - 39 -> {40} [style=dotted]; - 40 -> {41} [style=dotted]; - 41 -> {43} [color=green]; - 41 -> {42} [color=red]; - 42 -> {44} [color=red]; - 43 -> {44} [color=green]; - 44 -> {45}; - 45 -> {46}; + 40 -> {38} [color=green]; + 40 -> {45} [color=red]; + 41 -> {42}; + 42 -> {40}; + 42 -> {43} [style=dotted]; + 43 -> {40} [style=dotted]; + 44 -> {46}; + 45 -> {44} [color=red]; + 46 -> {36}; subgraph cluster_12 { color=red 47 [label="Enter function test_3" style="filled" fillcolor=red]; - 48 [label="Postponed enter to lambda"]; + 49 [label="Postponed enter to lambda"]; subgraph cluster_13 { color=blue - 49 [label="Enter function anonymousFunction"]; - 50 [label="Jump: ^test_3 Unit"]; - 51 [label="Stub" style="filled" fillcolor=gray]; + 51 [label="Enter function anonymousFunction"]; + 53 [label="Jump: ^test_3 Unit"]; + 54 [label="Stub" style="filled" fillcolor=gray]; 52 [label="Exit function anonymousFunction" style="filled" fillcolor=gray]; } - 53 [label="Call arguments union" style="filled" fillcolor=gray]; - 54 [label="Postponed exit from lambda"]; + 56 [label="Call arguments union" style="filled" fillcolor=gray]; + 50 [label="Postponed exit from lambda"]; 55 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=gray]; - 56 [label="Stub" style="filled" fillcolor=gray]; - 57 [label="Variable declaration: lval x: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 58 [label="Exit function test_3" style="filled" fillcolor=red]; + 57 [label="Stub" style="filled" fillcolor=gray]; + 58 [label="Variable declaration: lval x: R|kotlin/Nothing|" style="filled" fillcolor=gray]; + 48 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 47 -> {48}; - 48 -> {49}; - 48 -> {54} [color=red]; - 49 -> {50}; - 50 -> {58}; - 50 -> {51} [style=dotted]; - 51 -> {52} [style=dotted]; - 52 -> {53} [style=dotted]; - 52 -> {54} [color=green]; - 53 -> {55} [style=dotted]; - 54 -> {55} [color=green]; - 55 -> {58 56} [style=dotted]; - 56 -> {57} [style=dotted]; + 47 -> {49}; + 49 -> {51}; + 49 -> {50} [color=red]; + 50 -> {55} [color=green]; + 51 -> {53}; + 52 -> {56} [style=dotted]; + 52 -> {50} [color=green]; + 53 -> {48}; + 53 -> {54} [style=dotted]; + 54 -> {52} [style=dotted]; + 55 -> {48 57} [style=dotted]; + 56 -> {55} [style=dotted]; 57 -> {58} [style=dotted]; + 58 -> {48} [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 44eaad6b3f4..7b0f08bffbc 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot @@ -8,7 +8,6 @@ digraph safeCalls_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph safeCalls_kt { 2 [label="Enter function bar" style="filled" fillcolor=red]; 3 [label="Exit function bar" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph safeCalls_kt { 4 [label="Enter class A" style="filled" fillcolor=red]; 5 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; subgraph cluster_3 { @@ -32,82 +29,76 @@ digraph safeCalls_kt { 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 property" style="filled" fillcolor=red]; - 9 [label="Exit property" style="filled" fillcolor=red]; - } - - 8 -> {9}; - - subgraph cluster_5 { color=red 10 [label="Enter function getter" style="filled" fillcolor=red]; 11 [label="Exit function getter" style="filled" fillcolor=red]; } - 10 -> {11}; - subgraph cluster_6 { - color=red - 12 [label="Enter property" style="filled" fillcolor=red]; - 13 [label="Exit property" style="filled" fillcolor=red]; - } - - 12 -> {13}; - - subgraph cluster_7 { + subgraph cluster_5 { color=red 14 [label="Enter class B" 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]; + } + subgraph cluster_7 { + color=blue + 12 [label="Enter property" style="filled" fillcolor=red]; + 13 [label="Exit property" style="filled" fillcolor=red]; + } 15 [label="Exit class B" style="filled" fillcolor=red]; } - + 14 -> {8} [color=green]; + 8 -> {9}; + 9 -> {12} [color=green]; + 12 -> {13}; + 13 -> {15} [color=green]; subgraph cluster_8 { color=red 16 [label="Enter function test_1" style="filled" fillcolor=red]; - 17 [label="Access variable R|/x|"]; - 18 [label="Enter safe call"]; - 19 [label="Function call: R|/x|?.R|/A.foo|()"]; + 18 [label="Access variable R|/x|"]; + 19 [label="Enter safe call"]; + 21 [label="Function call: R|/x|?.R|/A.foo|()"]; 20 [label="Exit safe call"]; - 21 [label="Enter safe call"]; - 22 [label="Function call: R|/x|?.R|/A.foo|()?.R|/A.bar|()"]; + 22 [label="Enter safe call"]; + 24 [label="Function call: R|/x|?.R|/A.foo|()?.R|/A.bar|()"]; 23 [label="Exit safe call"]; - 24 [label="Exit function test_1" style="filled" fillcolor=red]; + 17 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 16 -> {17}; - 17 -> {18 20}; - 18 -> {19}; - 19 -> {20}; - 20 -> {21 23}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; + 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]; - 26 [label="Access variable R|/x|"]; - 27 [label="Enter safe call"]; - 28 [label="Access variable R|/B.foo|"]; + 27 [label="Access variable R|/x|"]; + 28 [label="Enter safe call"]; + 30 [label="Access variable R|/B.foo|"]; 29 [label="Exit safe call"]; - 30 [label="Enter safe call"]; - 31 [label="Access variable R|/B.bar|"]; + 31 [label="Enter safe call"]; + 33 [label="Access variable R|/B.bar|"]; 32 [label="Exit safe call"]; - 33 [label="Exit function test_2" style="filled" fillcolor=red]; + 26 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 25 -> {26}; - 26 -> {27 29}; - 27 -> {28}; - 28 -> {29}; - 29 -> {30 32}; - 30 -> {31}; - 31 -> {32}; - 32 -> {33}; + 25 -> {27}; + 27 -> {28 29}; + 28 -> {30}; + 29 -> {31 32}; + 30 -> {29}; + 31 -> {33}; + 32 -> {26}; + 33 -> {32}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/simple.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/simple.dot index 10ec5c7c81a..d41ab8fcd31 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/simple.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/simple.dot @@ -8,29 +8,27 @@ digraph simple_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { color=red 2 [label="Enter function test" style="filled" fillcolor=red]; - 3 [label="Const: Int(1)"]; - 4 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 5 [label="Access variable R|/x|"]; - 6 [label="Const: Int(1)"]; - 7 [label="Function call: R|/x|.R|kotlin/Int.plus|(...)"]; - 8 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 9 [label="Function call: R|/foo|()"]; - 10 [label="Exit 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]; } - - 2 -> {3}; - 3 -> {4}; + 2 -> {4}; 4 -> {5}; 5 -> {6}; 6 -> {7}; 7 -> {8}; 8 -> {9}; 9 -> {10}; + 10 -> {3}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/tryCatch.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/tryCatch.dot index 0b0142b093a..711034dacca 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/tryCatch.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/tryCatch.dot @@ -8,297 +8,294 @@ digraph tryCatch_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Try expression enter"]; + 2 [label="Try expression enter"]; subgraph cluster_2 { color=blue - 2 [label="Try main block enter"]; + 4 [label="Try main block enter"]; subgraph cluster_3 { color=blue - 3 [label="Enter block"]; - 4 [label="Const: Int(1)"]; - 5 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 6 [label="Exit block"]; + 7 [label="Enter block"]; + 8 [label="Const: Int(1)"]; + 9 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 10 [label="Exit block"]; } - 7 [label="Try main block exit"]; + 11 [label="Try main block exit"]; } subgraph cluster_4 { color=blue - 8 [label="Catch enter"]; + 6 [label="Catch enter"]; subgraph cluster_5 { color=blue - 9 [label="Enter block"]; - 10 [label="Const: Int(3)"]; - 11 [label="Variable declaration: lval z: R|kotlin/Int|"]; - 12 [label="Exit block"]; + 17 [label="Enter block"]; + 18 [label="Const: Int(3)"]; + 19 [label="Variable declaration: lval z: R|kotlin/Int|"]; + 20 [label="Exit block"]; } - 13 [label="Catch exit"]; + 21 [label="Catch exit"]; } subgraph cluster_6 { color=blue - 14 [label="Catch enter"]; + 5 [label="Catch enter"]; subgraph cluster_7 { color=blue - 15 [label="Enter block"]; - 16 [label="Const: Int(2)"]; - 17 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 18 [label="Exit block"]; + 12 [label="Enter block"]; + 13 [label="Const: Int(2)"]; + 14 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 15 [label="Exit block"]; } - 19 [label="Catch exit"]; + 16 [label="Catch exit"]; } - 20 [label="Try expression exit"]; + 3 [label="Try expression exit"]; } - 21 [label="Exit function test_1" style="filled" fillcolor=red]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {21 14 8 3}; - 3 -> {4}; - 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {20}; - 8 -> {21 9}; + 0 -> {2}; + 2 -> {4}; + 3 -> {1}; + 4 -> {1 5 6 7}; + 5 -> {1 12}; + 6 -> {1 17}; + 7 -> {8}; + 8 -> {9}; 9 -> {10}; 10 -> {11}; - 11 -> {12}; + 11 -> {3}; 12 -> {13}; - 13 -> {20}; - 14 -> {21 15}; + 13 -> {14}; + 14 -> {15}; 15 -> {16}; - 16 -> {17}; + 16 -> {3}; 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; + 21 -> {3}; subgraph cluster_8 { color=red 22 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_9 { color=blue - 23 [label="Try expression enter"]; + 24 [label="Try expression enter"]; subgraph cluster_10 { color=blue - 24 [label="Try main block enter"]; + 26 [label="Try main block enter"]; subgraph cluster_11 { color=blue - 25 [label="Enter block"]; - 26 [label="Const: Int(1)"]; - 27 [label="Exit block"]; + 28 [label="Enter block"]; + 29 [label="Const: Int(1)"]; + 30 [label="Exit block"]; } - 28 [label="Try main block exit"]; + 31 [label="Try main block exit"]; } subgraph cluster_12 { color=blue - 29 [label="Catch enter"]; + 27 [label="Catch enter"]; subgraph cluster_13 { color=blue - 30 [label="Enter block"]; - 31 [label="Const: Int(2)"]; - 32 [label="Exit block"]; + 32 [label="Enter block"]; + 33 [label="Const: Int(2)"]; + 34 [label="Exit block"]; } - 33 [label="Catch exit"]; + 35 [label="Catch exit"]; } - 34 [label="Try expression exit"]; + 25 [label="Try expression exit"]; } - 35 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 36 [label="Exit function test_2" style="filled" fillcolor=red]; + 36 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 23 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 22 -> {23}; - 23 -> {24}; - 24 -> {36 29 25}; - 25 -> {26}; - 26 -> {27}; - 27 -> {28}; - 28 -> {34}; - 29 -> {36 30}; + 22 -> {24}; + 24 -> {26}; + 25 -> {36}; + 26 -> {23 27 28}; + 27 -> {23 32}; + 28 -> {29}; + 29 -> {30}; 30 -> {31}; - 31 -> {32}; + 31 -> {25}; 32 -> {33}; 33 -> {34}; 34 -> {35}; - 35 -> {36}; + 35 -> {25}; + 36 -> {23}; subgraph cluster_14 { color=red 37 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_15 { color=blue - 38 [label="Enter while loop"]; + 39 [label="Enter while loop"]; subgraph cluster_16 { color=blue - 39 [label="Enter loop condition"]; - 40 [label="Const: Boolean(true)"]; - 41 [label="Exit loop condition"]; + 41 [label="Enter loop condition"]; + 42 [label="Const: Boolean(true)"]; + 43 [label="Exit loop condition"]; } subgraph cluster_17 { color=blue - 42 [label="Enter loop block"]; + 44 [label="Enter loop block"]; subgraph cluster_18 { color=blue - 43 [label="Enter block"]; + 45 [label="Enter block"]; subgraph cluster_19 { color=blue - 44 [label="Try expression enter"]; + 46 [label="Try expression enter"]; subgraph cluster_20 { color=blue - 45 [label="Try main block enter"]; + 48 [label="Try main block enter"]; subgraph cluster_21 { color=blue - 46 [label="Enter block"]; + 51 [label="Enter block"]; subgraph cluster_22 { color=blue - 47 [label="Enter when"]; + 52 [label="Enter when"]; subgraph cluster_23 { color=blue - 48 [label="Enter when branch condition "]; - 49 [label="Access variable R|/b|"]; - 50 [label="Exit when branch condition"]; + 54 [label="Enter when branch condition "]; + 55 [label="Access variable R|/b|"]; + 56 [label="Exit when branch condition"]; } - 51 [label="Synthetic else branch"]; - 52 [label="Enter when branch result"]; + 63 [label="Synthetic else branch"]; + 57 [label="Enter when branch result"]; subgraph cluster_24 { color=blue - 53 [label="Enter block"]; - 54 [label="Jump: ^test_3 Unit"]; - 55 [label="Stub" style="filled" fillcolor=gray]; - 56 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 57 [label="Exit when branch result" style="filled" fillcolor=gray]; - 58 [label="Exit when"]; + 62 [label="Exit when branch result" style="filled" fillcolor=gray]; + 53 [label="Exit when"]; } - 59 [label="Const: Int(1)"]; - 60 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 64 [label="Const: Int(1)"]; + 65 [label="Variable declaration: lval x: R|kotlin/Int|"]; subgraph cluster_25 { color=blue - 61 [label="Enter when"]; + 66 [label="Enter when"]; subgraph cluster_26 { color=blue - 62 [label="Enter when branch condition "]; - 63 [label="Access variable R|/b|"]; - 64 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 65 [label="Exit when branch condition"]; + 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"]; } - 66 [label="Synthetic else branch"]; - 67 [label="Enter when branch result"]; + 78 [label="Synthetic else branch"]; + 72 [label="Enter when branch result"]; subgraph cluster_27 { color=blue - 68 [label="Enter block"]; - 69 [label="Jump: break@@@[Boolean(true)] "]; - 70 [label="Stub" style="filled" fillcolor=gray]; - 71 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 72 [label="Exit when branch result" style="filled" fillcolor=gray]; - 73 [label="Exit when"]; + 77 [label="Exit when branch result" style="filled" fillcolor=gray]; + 67 [label="Exit when"]; } - 74 [label="Exit block"]; + 79 [label="Exit block"]; } - 75 [label="Try main block exit"]; + 80 [label="Try main block exit"]; } subgraph cluster_28 { color=blue - 76 [label="Catch enter"]; + 50 [label="Catch enter"]; subgraph cluster_29 { color=blue - 77 [label="Enter block"]; - 78 [label="Jump: break@@@[Boolean(true)] "]; - 79 [label="Stub" style="filled" fillcolor=gray]; - 80 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 81 [label="Catch exit" style="filled" fillcolor=gray]; + 90 [label="Catch exit" style="filled" fillcolor=gray]; } subgraph cluster_30 { color=blue - 82 [label="Catch enter"]; + 49 [label="Catch enter"]; subgraph cluster_31 { color=blue - 83 [label="Enter block"]; - 84 [label="Jump: continue@@@[Boolean(true)] "]; - 85 [label="Stub" style="filled" fillcolor=gray]; - 86 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 87 [label="Catch exit" style="filled" fillcolor=gray]; + 85 [label="Catch exit" style="filled" fillcolor=gray]; } - 88 [label="Try expression exit"]; + 47 [label="Try expression exit"]; } - 89 [label="Const: Int(2)"]; - 90 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 91 [label="Exit block"]; + 91 [label="Const: Int(2)"]; + 92 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 93 [label="Exit block"]; } - 92 [label="Exit loop block"]; + 94 [label="Exit loop block"]; } - 93 [label="Exit whileloop"]; + 40 [label="Exit whileloop"]; } - 94 [label="Const: Int(3)"]; - 95 [label="Variable declaration: lval z: R|kotlin/Int|"]; - 96 [label="Exit function test_3" style="filled" fillcolor=red]; + 95 [label="Const: Int(3)"]; + 96 [label="Variable declaration: lval z: R|kotlin/Int|"]; + 38 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 37 -> {38}; - 38 -> {39}; - 39 -> {40}; - 40 -> {41}; + 37 -> {39}; + 39 -> {41}; + 40 -> {95}; 41 -> {42}; - 41 -> {93} [style=dotted]; 42 -> {43}; 43 -> {44}; + 43 -> {40} [style=dotted]; 44 -> {45}; - 45 -> {96 82 76 46}; - 46 -> {47}; - 47 -> {48}; - 48 -> {49}; - 49 -> {50}; - 50 -> {52 51}; - 51 -> {58}; - 52 -> {53}; - 53 -> {54}; - 54 -> {96}; - 54 -> {55} [style=dotted]; - 55 -> {56} [style=dotted]; - 56 -> {57} [style=dotted]; - 57 -> {58} [style=dotted]; + 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 -> {60}; - 60 -> {61}; - 61 -> {62}; - 62 -> {63}; - 63 -> {64}; + 59 -> {38}; + 59 -> {60} [style=dotted]; + 60 -> {61} [style=dotted]; + 61 -> {62} [style=dotted]; + 62 -> {53} [style=dotted]; + 63 -> {53}; 64 -> {65}; - 65 -> {67 66}; - 66 -> {73}; - 67 -> {68}; + 65 -> {66}; + 66 -> {68}; + 67 -> {79}; 68 -> {69}; - 69 -> {93}; - 69 -> {70} [style=dotted]; - 70 -> {71} [style=dotted]; - 71 -> {72} [style=dotted]; - 72 -> {73} [style=dotted]; + 69 -> {70}; + 70 -> {71}; + 71 -> {72 78}; + 72 -> {73}; 73 -> {74}; - 74 -> {75}; - 75 -> {88}; - 76 -> {96 77}; - 77 -> {78}; - 78 -> {93}; - 78 -> {79} [style=dotted]; - 79 -> {80} [style=dotted]; - 80 -> {81} [style=dotted]; - 81 -> {88} [style=dotted]; - 82 -> {96 83}; - 83 -> {84}; - 84 -> {38}; + 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 -> {39}; + 82 -> {83} [style=dotted]; + 83 -> {84} [style=dotted]; 84 -> {85} [style=dotted]; - 85 -> {86} [style=dotted]; - 86 -> {87} [style=dotted]; + 85 -> {47} [style=dotted]; + 86 -> {87}; + 87 -> {40}; 87 -> {88} [style=dotted]; - 88 -> {89}; - 89 -> {90}; - 90 -> {91}; + 88 -> {89} [style=dotted]; + 89 -> {90} [style=dotted]; + 90 -> {47} [style=dotted]; 91 -> {92}; - 92 -> {39}; + 92 -> {93}; 93 -> {94}; - 94 -> {95}; + 94 -> {41}; 95 -> {96}; + 96 -> {38}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot index 14ad2edeb5c..5b030373ebf 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot @@ -8,133 +8,131 @@ digraph when_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; + 2 [label="Enter when"]; subgraph cluster_2 { color=blue - 2 [label="Enter when branch condition "]; - 3 [label="Access variable R|/x|"]; - 4 [label="Const: Int(1)"]; - 5 [label="Operator =="]; - 6 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_3 { - color=blue - 7 [label="Enter when branch condition "]; - 8 [label="Access variable R|/x|"]; - 9 [label="Const: Int(2)"]; - 10 [label="Function call: R|/x|.R|kotlin/Int.rem|(...)"]; - 11 [label="Const: Int(0)"]; - 12 [label="Operator =="]; - 13 [label="Exit when branch condition"]; - } - subgraph cluster_4 { color=blue 14 [label="Enter when branch condition "]; - 15 [label="Const: Int(1)"]; - 16 [label="Const: Int(1)"]; - 17 [label="Function call: Int(1).R|kotlin/Int.minus|(...)"]; + 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 - 21 [label="Enter when branch condition else"]; - 22 [label="Exit when branch condition"]; + 39 [label="Enter when branch condition else"]; + 40 [label="Exit when branch condition"]; } - 23 [label="Enter when branch result"]; + 41 [label="Enter when branch result"]; subgraph cluster_6 { color=blue - 24 [label="Enter block"]; - 25 [label="Const: Int(5)"]; - 26 [label="Exit block"]; + 42 [label="Enter block"]; + 43 [label="Const: Int(5)"]; + 44 [label="Exit block"]; } - 27 [label="Exit when branch result"]; - 28 [label="Enter when branch result"]; + 45 [label="Exit when branch result"]; + 33 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 29 [label="Enter block"]; - 30 [label="Jump: ^test_1 Unit"]; - 31 [label="Stub" style="filled" fillcolor=gray]; - 32 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 33 [label="Exit when branch result" style="filled" fillcolor=gray]; - 34 [label="Enter when branch result"]; + 38 [label="Exit when branch result" style="filled" fillcolor=gray]; + 21 [label="Enter when branch result"]; subgraph cluster_8 { color=blue - 35 [label="Enter block"]; - 36 [label="Const: Int(20)"]; - 37 [label="Exit block"]; + 22 [label="Enter block"]; + 23 [label="Const: Int(20)"]; + 24 [label="Exit block"]; } - 38 [label="Exit when branch result"]; - 39 [label="Enter when branch result"]; + 25 [label="Exit when branch result"]; + 9 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 40 [label="Enter block"]; - 41 [label="Const: Int(10)"]; - 42 [label="Exit block"]; + 10 [label="Enter block"]; + 11 [label="Const: Int(10)"]; + 12 [label="Exit block"]; } - 43 [label="Exit when branch result"]; - 44 [label="Exit when"]; + 13 [label="Exit when branch result"]; + 3 [label="Exit when"]; } - 45 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 46 [label="Exit function test_1" style="filled" fillcolor=red]; + 46 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; + 0 -> {2}; + 2 -> {4}; + 3 -> {46}; 4 -> {5}; 5 -> {6}; - 6 -> {39 7}; + 6 -> {7}; 7 -> {8}; - 8 -> {9}; + 8 -> {9 14}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {34 14}; + 13 -> {3}; 14 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; 19 -> {20}; - 20 -> {28 21}; + 20 -> {21 26}; 21 -> {22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {26}; + 25 -> {3}; 26 -> {27}; - 27 -> {44}; + 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {46}; - 30 -> {31} [style=dotted]; - 31 -> {32} [style=dotted]; - 32 -> {33} [style=dotted]; - 33 -> {44} [style=dotted]; + 30 -> {31}; + 31 -> {32}; + 32 -> {33 39}; + 33 -> {34}; 34 -> {35}; - 35 -> {36}; - 36 -> {37}; - 37 -> {38}; - 38 -> {44}; + 35 -> {1}; + 35 -> {36} [style=dotted]; + 36 -> {37} [style=dotted]; + 37 -> {38} [style=dotted]; + 38 -> {3} [style=dotted]; 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; 44 -> {45}; - 45 -> {46}; + 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]; subgraph cluster_11 { @@ -142,7 +140,6 @@ digraph when_kt { 49 [label="Enter class B" style="filled" fillcolor=red]; 50 [label="Exit class B" style="filled" fillcolor=red]; } - 49 -> {50} [color=green]; subgraph cluster_12 { @@ -150,57 +147,56 @@ digraph when_kt { 51 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_13 { color=blue - 52 [label="Enter when"]; + 53 [label="Enter when"]; subgraph cluster_14 { color=blue - 53 [label="Enter when branch condition "]; + 55 [label="Enter when branch condition "]; subgraph cluster_15 { color=blue - 54 [label="Enter &&"]; - 55 [label="Access variable R|/x|"]; - 56 [label="Type operator: (R|/x| is R|A|)"]; - 57 [label="Exit left part of &&"]; - 58 [label="Enter right part of &&"]; - 59 [label="Access variable R|/x|"]; - 60 [label="Type operator: (R|/x| is R|B|)"]; - 61 [label="Exit &&"]; + 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 &&"]; } - 62 [label="Exit when branch condition"]; + 64 [label="Exit when branch condition"]; } - 63 [label="Synthetic else branch"]; - 64 [label="Enter when branch result"]; + 71 [label="Synthetic else branch"]; + 65 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 65 [label="Enter block"]; - 66 [label="Access variable R|/x|"]; - 67 [label="Type operator: (R|/x| is R|A|)"]; - 68 [label="Exit block"]; + 66 [label="Enter block"]; + 67 [label="Access variable R|/x|"]; + 68 [label="Type operator: (R|/x| is R|A|)"]; + 69 [label="Exit block"]; } - 69 [label="Exit when branch result"]; - 70 [label="Exit when"]; + 70 [label="Exit when branch result"]; + 54 [label="Exit when"]; } - 71 [label="Exit function test_2" style="filled" fillcolor=red]; + 52 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 51 -> {52}; - 52 -> {53}; - 53 -> {54}; - 54 -> {55}; - 55 -> {56}; - 56 -> {57}; - 57 -> {61 58}; + 51 -> {53}; + 53 -> {55}; + 54 -> {52}; + 55 -> {57}; + 56 -> {64}; + 57 -> {58}; 58 -> {59}; 59 -> {60}; - 60 -> {61}; + 60 -> {56 61}; 61 -> {62}; - 62 -> {64 63}; - 63 -> {70}; - 64 -> {65}; + 62 -> {63}; + 63 -> {56}; + 64 -> {65 71}; 65 -> {66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {71}; + 70 -> {54}; + 71 -> {54}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot b/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot index 2e5183f1012..cfee9659b4a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot @@ -6,19 +6,17 @@ digraph exhaustiveWhenAndDNNType_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super|>()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super|>()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter function values" style="filled" fillcolor=red]; 4 [label="Exit function values" style="filled" fillcolor=red]; } - 3 -> {4}; subgraph cluster_2 { @@ -26,7 +24,6 @@ digraph exhaustiveWhenAndDNNType_kt { 5 [label="Enter function valueOf" style="filled" fillcolor=red]; 6 [label="Exit function valueOf" style="filled" fillcolor=red]; } - 5 -> {6}; subgraph cluster_3 { @@ -34,25 +31,22 @@ digraph exhaustiveWhenAndDNNType_kt { 7 [label="Enter class SomeEnum" style="filled" fillcolor=red]; 8 [label="Exit class SomeEnum" style="filled" fillcolor=red]; } - 7 -> {8} [color=green]; subgraph cluster_4 { color=red 9 [label="Enter function " style="filled" fillcolor=red]; - 10 [label="Delegated constructor call: super()"]; - 11 [label="Exit function " style="filled" fillcolor=red]; + 11 [label="Delegated constructor call: super()"]; + 10 [label="Exit function " style="filled" fillcolor=red]; } - - 9 -> {10}; - 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 { @@ -60,254 +54,250 @@ digraph exhaustiveWhenAndDNNType_kt { 14 [label="Enter function takeB" style="filled" fillcolor=red]; 15 [label="Exit function takeB" style="filled" fillcolor=red]; } - 14 -> {15}; subgraph cluster_7 { color=red 16 [label="Enter function test_1" style="filled" fillcolor=red]; - 17 [label="Access qualifier /SomeEnum"]; - 18 [label="Access variable R|/SomeEnum.A1|"]; - 19 [label="Variable declaration: lval flag: R|SomeEnum|"]; + 18 [label="Access qualifier /SomeEnum"]; + 19 [label="Access variable R|/SomeEnum.A1|"]; + 20 [label="Variable declaration: lval flag: R|SomeEnum|"]; subgraph cluster_8 { color=blue - 20 [label="Enter when"]; - 21 [label="Access variable R|/flag|"]; - 22 [label="Check not null: R|/flag|!!"]; + 21 [label="Enter when"]; + 23 [label="Access variable R|/flag|"]; + 24 [label="Check not null: R|/flag|!!"]; subgraph cluster_9 { color=blue - 23 [label="Enter when branch condition "]; - 24 [label="Access qualifier /SomeEnum"]; - 25 [label="Access variable R|/SomeEnum.A1|"]; - 26 [label="Operator =="]; - 27 [label="Exit when branch condition"]; + 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 - 28 [label="Enter when branch condition "]; - 29 [label="Access qualifier /SomeEnum"]; - 30 [label="Access variable R|/SomeEnum.A2|"]; - 31 [label="Operator =="]; - 32 [label="Exit when branch condition"]; + 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"]; } - 33 [label="Enter when branch result"]; + 40 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 34 [label="Enter block"]; - 35 [label="Function call: R|/B.B|()"]; - 36 [label="Exit block"]; + 41 [label="Enter block"]; + 42 [label="Function call: R|/B.B|()"]; + 43 [label="Exit block"]; } - 37 [label="Exit when branch result"]; - 38 [label="Enter when branch result"]; + 44 [label="Exit when branch result"]; + 30 [label="Enter when branch result"]; subgraph cluster_12 { color=blue - 39 [label="Enter block"]; - 40 [label="Function call: R|/B.B|()"]; - 41 [label="Exit block"]; + 31 [label="Enter block"]; + 32 [label="Function call: R|/B.B|()"]; + 33 [label="Exit block"]; } - 42 [label="Exit when branch result"]; - 43 [label="Exit when"]; + 34 [label="Exit when branch result"]; + 22 [label="Exit when"]; } - 44 [label="Variable declaration: lval b: R|B|"]; - 45 [label="Access variable R|/b|"]; - 46 [label="Function call: R|/takeB|(...)"]; - 47 [label="Exit function test_1" style="filled" fillcolor=red]; + 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]; } - - 16 -> {17}; - 17 -> {18}; + 16 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {22}; - 22 -> {23}; + 21 -> {23}; + 22 -> {45}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {38 28}; + 27 -> {28}; 28 -> {29}; - 29 -> {30}; + 29 -> {30 35}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {35}; + 34 -> {22}; 35 -> {36}; 36 -> {37}; - 37 -> {43}; + 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; - 44 -> {45}; + 44 -> {22}; 45 -> {46}; 46 -> {47}; + 47 -> {17}; subgraph cluster_13 { color=red 48 [label="Enter function test_2" style="filled" fillcolor=red]; - 49 [label="Access qualifier /SomeEnum"]; - 50 [label="Access variable R|/SomeEnum.A1|"]; - 51 [label="Variable declaration: lval flag: R|SomeEnum|"]; + 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 - 52 [label="Enter when"]; - 53 [label="Access variable R|/flag|"]; - 54 [label="Check not null: R|/flag|!!"]; + 53 [label="Enter when"]; + 55 [label="Access variable R|/flag|"]; + 56 [label="Check not null: R|/flag|!!"]; subgraph cluster_15 { color=blue - 55 [label="Enter when branch condition "]; - 56 [label="Access qualifier /SomeEnum"]; - 57 [label="Access variable R|/SomeEnum.A1|"]; - 58 [label="Operator =="]; - 59 [label="Exit when branch condition"]; + 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 - 60 [label="Enter when branch condition "]; - 61 [label="Access qualifier /SomeEnum"]; - 62 [label="Access variable R|/SomeEnum.A2|"]; - 63 [label="Operator =="]; - 64 [label="Exit when branch condition"]; + 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"]; } - 65 [label="Enter when branch result"]; + 72 [label="Enter when branch result"]; subgraph cluster_17 { color=blue - 66 [label="Enter block"]; - 67 [label="Function call: R|/B.B|()"]; - 68 [label="Exit block"]; + 73 [label="Enter block"]; + 74 [label="Function call: R|/B.B|()"]; + 75 [label="Exit block"]; } - 69 [label="Exit when branch result"]; - 70 [label="Enter when branch result"]; + 76 [label="Exit when branch result"]; + 62 [label="Enter when branch result"]; subgraph cluster_18 { color=blue - 71 [label="Enter block"]; - 72 [label="Function call: R|/B.B|()"]; - 73 [label="Exit block"]; + 63 [label="Enter block"]; + 64 [label="Function call: R|/B.B|()"]; + 65 [label="Exit block"]; } - 74 [label="Exit when branch result"]; - 75 [label="Exit when"]; + 66 [label="Exit when branch result"]; + 54 [label="Exit when"]; } - 76 [label="Variable declaration: lval b: R|B|"]; - 77 [label="Access variable R|/b|"]; - 78 [label="Function call: R|/takeB|(...)"]; - 79 [label="Exit function test_2" style="filled" fillcolor=red]; + 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 -> {49}; - 49 -> {50}; + 48 -> {50}; 50 -> {51}; 51 -> {52}; 52 -> {53}; - 53 -> {54}; - 54 -> {55}; + 53 -> {55}; + 54 -> {77}; 55 -> {56}; 56 -> {57}; 57 -> {58}; 58 -> {59}; - 59 -> {70 60}; + 59 -> {60}; 60 -> {61}; - 61 -> {62}; + 61 -> {62 67}; 62 -> {63}; 63 -> {64}; 64 -> {65}; 65 -> {66}; - 66 -> {67}; + 66 -> {54}; 67 -> {68}; 68 -> {69}; - 69 -> {75}; + 69 -> {70}; 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; 75 -> {76}; - 76 -> {77}; + 76 -> {54}; 77 -> {78}; 78 -> {79}; + 79 -> {49}; subgraph cluster_19 { color=red 80 [label="Enter function test_3" style="filled" fillcolor=red]; - 81 [label="Access qualifier /SomeEnum"]; - 82 [label="Access variable R|/SomeEnum.A1|"]; - 83 [label="Variable declaration: lval flag: R|SomeEnum|"]; + 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 - 84 [label="Enter when"]; - 85 [label="Access variable R|/flag|"]; + 85 [label="Enter when"]; + 87 [label="Access variable R|/flag|"]; subgraph cluster_21 { color=blue - 86 [label="Enter when branch condition "]; - 87 [label="Access qualifier /SomeEnum"]; - 88 [label="Access variable R|/SomeEnum.A1|"]; - 89 [label="Operator =="]; - 90 [label="Exit when branch condition"]; + 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 - 91 [label="Enter when branch condition "]; - 92 [label="Access qualifier /SomeEnum"]; - 93 [label="Access variable R|/SomeEnum.A2|"]; - 94 [label="Operator =="]; - 95 [label="Exit when branch condition"]; + 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"]; } - 96 [label="Enter when branch result"]; + 103 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 97 [label="Enter block"]; - 98 [label="Function call: R|/B.B|()"]; - 99 [label="Exit block"]; + 104 [label="Enter block"]; + 105 [label="Function call: R|/B.B|()"]; + 106 [label="Exit block"]; } - 100 [label="Exit when branch result"]; - 101 [label="Enter when branch result"]; + 107 [label="Exit when branch result"]; + 93 [label="Enter when branch result"]; subgraph cluster_24 { color=blue - 102 [label="Enter block"]; - 103 [label="Function call: R|/B.B|()"]; - 104 [label="Exit block"]; + 94 [label="Enter block"]; + 95 [label="Function call: R|/B.B|()"]; + 96 [label="Exit block"]; } - 105 [label="Exit when branch result"]; - 106 [label="Exit when"]; + 97 [label="Exit when branch result"]; + 86 [label="Exit when"]; } - 107 [label="Variable declaration: lval b: R|B|"]; - 108 [label="Access variable R|/b|"]; - 109 [label="Function call: R|/takeB|(...)"]; - 110 [label="Exit function test_3" style="filled" fillcolor=red]; + 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 -> {81}; - 81 -> {82}; + 80 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {86}; - 86 -> {87}; + 85 -> {87}; + 86 -> {108}; 87 -> {88}; 88 -> {89}; 89 -> {90}; - 90 -> {101 91}; + 90 -> {91}; 91 -> {92}; - 92 -> {93}; + 92 -> {93 98}; 93 -> {94}; 94 -> {95}; 95 -> {96}; 96 -> {97}; - 97 -> {98}; + 97 -> {86}; 98 -> {99}; 99 -> {100}; - 100 -> {106}; + 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; 105 -> {106}; 106 -> {107}; - 107 -> {108}; + 107 -> {86}; 108 -> {109}; 109 -> {110}; + 110 -> {81}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot index 6d4b295078f..3be4ff9de2e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot @@ -8,7 +8,6 @@ digraph bangbang_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,350 +15,341 @@ digraph bangbang_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function test_0" style="filled" fillcolor=red]; - 5 [label="Access variable R|/a|"]; - 6 [label="Check not null: R|/a|!!"]; - 7 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 8 [label="Access variable R|/a|"]; - 9 [label="Function call: R|/a|.R|/A.foo|()"]; - 10 [label="Exit 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|()"]; + 5 [label="Exit function test_0" style="filled" fillcolor=red]; } - - 4 -> {5}; - 5 -> {6}; + 4 -> {6}; 6 -> {7}; 7 -> {8}; 8 -> {9}; 9 -> {10}; + 10 -> {5}; subgraph cluster_3 { color=red 11 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_4 { color=blue - 12 [label="Enter when"]; + 13 [label="Enter when"]; subgraph cluster_5 { color=blue - 13 [label="Enter when branch condition "]; - 14 [label="Access variable R|/a|"]; - 15 [label="Check not null: R|/a|!!"]; - 16 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 17 [label="Exit when branch condition"]; + 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"]; } - 18 [label="Synthetic else branch"]; - 19 [label="Enter when branch result"]; + 26 [label="Synthetic else branch"]; + 20 [label="Enter when branch result"]; subgraph cluster_6 { color=blue - 20 [label="Enter block"]; - 21 [label="Access variable R|/a|"]; - 22 [label="Function call: R|/a|.R|/A.foo|()"]; - 23 [label="Exit block"]; + 21 [label="Enter block"]; + 22 [label="Access variable R|/a|"]; + 23 [label="Function call: R|/a|.R|/A.foo|()"]; + 24 [label="Exit block"]; } - 24 [label="Exit when branch result"]; - 25 [label="Exit when"]; + 25 [label="Exit when branch result"]; + 14 [label="Exit when"]; } - 26 [label="Access variable R|/a|"]; - 27 [label="Function call: R|/a|.R|/A.foo|()"]; - 28 [label="Exit function test_1" style="filled" fillcolor=red]; + 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]; } - - 11 -> {12}; - 12 -> {13}; - 13 -> {14}; - 14 -> {15}; + 11 -> {13}; + 13 -> {15}; + 14 -> {27}; 15 -> {16}; 16 -> {17}; - 17 -> {19 18}; - 18 -> {25}; - 19 -> {20}; + 17 -> {18}; + 18 -> {19}; + 19 -> {20 26}; 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {26}; - 26 -> {27}; + 25 -> {14}; + 26 -> {14}; 27 -> {28}; + 28 -> {12}; subgraph cluster_7 { color=red 29 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue - 30 [label="Enter when"]; + 31 [label="Enter when"]; subgraph cluster_9 { color=blue - 31 [label="Enter when branch condition "]; + 33 [label="Enter when branch condition "]; subgraph cluster_10 { color=blue - 32 [label="Enter &&"]; - 33 [label="Access variable R|/a|"]; - 34 [label="Check not null: R|/a|!!"]; - 35 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 36 [label="Exit left part of &&"]; - 37 [label="Enter right part of &&"]; - 38 [label="Access variable R|/b|"]; - 39 [label="Exit &&"]; + 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 &&"]; } - 40 [label="Exit when branch condition"]; + 42 [label="Exit when branch condition"]; } - 41 [label="Synthetic else branch"]; - 42 [label="Enter when branch result"]; + 49 [label="Synthetic else branch"]; + 43 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 43 [label="Enter block"]; - 44 [label="Access variable R|/a|"]; - 45 [label="Function call: R|/a|.R|/A.foo|()"]; - 46 [label="Exit block"]; + 44 [label="Enter block"]; + 45 [label="Access variable R|/a|"]; + 46 [label="Function call: R|/a|.R|/A.foo|()"]; + 47 [label="Exit block"]; } - 47 [label="Exit when branch result"]; - 48 [label="Exit when"]; + 48 [label="Exit when branch result"]; + 32 [label="Exit when"]; } - 49 [label="Access variable R|/a|"]; - 50 [label="Function call: R|/a|.R|/A.foo|()"]; - 51 [label="Exit function test_2" style="filled" fillcolor=red]; + 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 -> {30}; - 30 -> {31}; - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {35}; + 29 -> {31}; + 31 -> {33}; + 32 -> {50}; + 33 -> {35}; + 34 -> {42}; 35 -> {36}; - 36 -> {39 37}; + 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {40}; - 40 -> {42 41}; - 41 -> {48}; - 42 -> {43}; + 39 -> {34 40}; + 40 -> {41}; + 41 -> {34}; + 42 -> {43 49}; 43 -> {44}; 44 -> {45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {49}; - 49 -> {50}; + 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 - 53 [label="Enter when"]; + 54 [label="Enter when"]; subgraph cluster_14 { color=blue - 54 [label="Enter when branch condition "]; + 56 [label="Enter when branch condition "]; subgraph cluster_15 { color=blue - 55 [label="Enter &&"]; - 56 [label="Access variable R|/b|"]; - 57 [label="Exit left part of &&"]; - 58 [label="Enter right part of &&"]; - 59 [label="Access variable R|/a|"]; - 60 [label="Check not null: R|/a|!!"]; - 61 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 62 [label="Exit &&"]; + 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 &&"]; } - 63 [label="Exit when branch condition"]; + 65 [label="Exit when branch condition"]; } - 64 [label="Synthetic else branch"]; - 65 [label="Enter when branch result"]; + 72 [label="Synthetic else branch"]; + 66 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 66 [label="Enter block"]; - 67 [label="Access variable R|/a|"]; - 68 [label="Function call: R|/a|.R|/A.foo|()"]; - 69 [label="Exit block"]; + 67 [label="Enter block"]; + 68 [label="Access variable R|/a|"]; + 69 [label="Function call: R|/a|.R|/A.foo|()"]; + 70 [label="Exit block"]; } - 70 [label="Exit when branch result"]; - 71 [label="Exit when"]; + 71 [label="Exit when branch result"]; + 55 [label="Exit when"]; } - 72 [label="Access variable R|/a|"]; - 73 [label="Function call: R|/a|.#()"]; - 74 [label="Exit function test_3" style="filled" fillcolor=red]; + 73 [label="Access variable R|/a|"]; + 74 [label="Function call: R|/a|.#()"]; + 53 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 52 -> {53}; - 53 -> {54}; - 54 -> {55}; - 55 -> {56}; - 56 -> {57}; - 57 -> {62 58}; + 52 -> {54}; + 54 -> {56}; + 55 -> {73}; + 56 -> {58}; + 57 -> {65}; 58 -> {59}; 59 -> {60}; - 60 -> {61}; + 60 -> {57 61}; 61 -> {62}; 62 -> {63}; - 63 -> {65 64}; - 64 -> {71}; - 65 -> {66}; + 63 -> {64}; + 64 -> {57}; + 65 -> {66 72}; 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; 70 -> {71}; - 71 -> {72}; - 72 -> {73}; + 71 -> {55}; + 72 -> {55}; 73 -> {74}; + 74 -> {53}; subgraph cluster_17 { color=red 75 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_18 { color=blue - 76 [label="Enter when"]; + 77 [label="Enter when"]; subgraph cluster_19 { color=blue - 77 [label="Enter when branch condition "]; + 79 [label="Enter when branch condition "]; subgraph cluster_20 { color=blue - 78 [label="Enter ||"]; - 79 [label="Access variable R|/a|"]; - 80 [label="Check not null: R|/a|!!"]; - 81 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 82 [label="Exit left part of ||"]; - 83 [label="Enter right part of ||"]; - 84 [label="Access variable R|/b|"]; - 85 [label="Exit ||"]; + 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 ||"]; } - 86 [label="Exit when branch condition"]; + 88 [label="Exit when branch condition"]; } - 87 [label="Synthetic else branch"]; - 88 [label="Enter when branch result"]; + 95 [label="Synthetic else branch"]; + 89 [label="Enter when branch result"]; subgraph cluster_21 { color=blue - 89 [label="Enter block"]; - 90 [label="Access variable R|/a|"]; - 91 [label="Function call: R|/a|.R|/A.foo|()"]; - 92 [label="Exit block"]; + 90 [label="Enter block"]; + 91 [label="Access variable R|/a|"]; + 92 [label="Function call: R|/a|.R|/A.foo|()"]; + 93 [label="Exit block"]; } - 93 [label="Exit when branch result"]; - 94 [label="Exit when"]; + 94 [label="Exit when branch result"]; + 78 [label="Exit when"]; } - 95 [label="Access variable R|/a|"]; - 96 [label="Function call: R|/a|.R|/A.foo|()"]; - 97 [label="Exit function test_4" style="filled" fillcolor=red]; + 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 -> {76}; - 76 -> {77}; - 77 -> {78}; - 78 -> {79}; - 79 -> {80}; - 80 -> {81}; + 75 -> {77}; + 77 -> {79}; + 78 -> {96}; + 79 -> {81}; + 80 -> {88}; 81 -> {82}; - 82 -> {85 83}; + 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {86}; - 86 -> {88 87}; - 87 -> {94}; - 88 -> {89}; + 85 -> {80 86}; + 86 -> {87}; + 87 -> {80}; + 88 -> {89 95}; 89 -> {90}; 90 -> {91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; - 94 -> {95}; - 95 -> {96}; + 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 - 99 [label="Enter when"]; + 100 [label="Enter when"]; subgraph cluster_24 { color=blue - 100 [label="Enter when branch condition "]; + 102 [label="Enter when branch condition "]; subgraph cluster_25 { color=blue - 101 [label="Enter ||"]; - 102 [label="Access variable R|/b|"]; - 103 [label="Exit left part of ||"]; - 104 [label="Enter right part of ||"]; - 105 [label="Access variable R|/a|"]; - 106 [label="Check not null: R|/a|!!"]; - 107 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 108 [label="Exit ||"]; + 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 ||"]; } - 109 [label="Exit when branch condition"]; + 111 [label="Exit when branch condition"]; } - 110 [label="Synthetic else branch"]; - 111 [label="Enter when branch result"]; + 118 [label="Synthetic else branch"]; + 112 [label="Enter when branch result"]; subgraph cluster_26 { color=blue - 112 [label="Enter block"]; - 113 [label="Access variable R|/a|"]; - 114 [label="Function call: R|/a|.#()"]; - 115 [label="Exit block"]; + 113 [label="Enter block"]; + 114 [label="Access variable R|/a|"]; + 115 [label="Function call: R|/a|.#()"]; + 116 [label="Exit block"]; } - 116 [label="Exit when branch result"]; - 117 [label="Exit when"]; + 117 [label="Exit when branch result"]; + 101 [label="Exit when"]; } - 118 [label="Access variable R|/a|"]; - 119 [label="Function call: R|/a|.#()"]; - 120 [label="Exit function test_5" style="filled" fillcolor=red]; + 119 [label="Access variable R|/a|"]; + 120 [label="Function call: R|/a|.#()"]; + 99 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 98 -> {99}; - 99 -> {100}; - 100 -> {101}; - 101 -> {102}; - 102 -> {103}; - 103 -> {108 104}; + 98 -> {100}; + 100 -> {102}; + 101 -> {119}; + 102 -> {104}; + 103 -> {111}; 104 -> {105}; 105 -> {106}; - 106 -> {107}; + 106 -> {103 107}; 107 -> {108}; 108 -> {109}; - 109 -> {111 110}; - 110 -> {117}; - 111 -> {112}; + 109 -> {110}; + 110 -> {103}; + 111 -> {112 118}; 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; 116 -> {117}; - 117 -> {118}; - 118 -> {119}; + 117 -> {101}; + 118 -> {101}; 119 -> {120}; + 120 -> {99}; subgraph cluster_27 { color=red 121 [label="Enter function test_6" style="filled" fillcolor=red]; - 122 [label="Access variable R|/x|"]; - 123 [label="Check not null: R|/x|!!"]; - 124 [label="Function call: R|/x|!!.R|/A.foo|()"]; - 125 [label="Exit 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]; } - - 121 -> {122}; - 122 -> {123}; + 121 -> {123}; 123 -> {124}; 124 -> {125}; + 125 -> {122}; subgraph cluster_28 { color=red 126 [label="Enter function test_7" style="filled" fillcolor=red]; - 127 [label="Access variable R|/x|"]; - 128 [label="Check not null: R|/x|!!"]; - 129 [label="Function call: R|/x|!!.R|/A.foo|()"]; - 130 [label="Exit 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]; } - - 126 -> {127}; - 127 -> {128}; + 126 -> {128}; 128 -> {129}; 129 -> {130}; + 130 -> {127}; } 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 746dbad6c09..caedfeedd4a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot @@ -8,7 +8,6 @@ digraph booleanOperators_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph booleanOperators_kt { 2 [label="Enter function bool" style="filled" fillcolor=red]; 3 [label="Exit function bool" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph booleanOperators_kt { 4 [label="Enter class A" style="filled" fillcolor=red]; 5 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; subgraph cluster_3 { @@ -32,7 +29,6 @@ digraph booleanOperators_kt { 6 [label="Enter function bar" style="filled" fillcolor=red]; 7 [label="Exit function bar" style="filled" fillcolor=red]; } - 6 -> {7}; subgraph cluster_4 { @@ -40,7 +36,6 @@ digraph booleanOperators_kt { 8 [label="Enter class B" style="filled" fillcolor=red]; 9 [label="Exit class B" style="filled" fillcolor=red]; } - 8 -> {9} [color=green]; subgraph cluster_5 { @@ -48,7 +43,6 @@ digraph booleanOperators_kt { 10 [label="Enter function baz" style="filled" fillcolor=red]; 11 [label="Exit function baz" style="filled" fillcolor=red]; } - 10 -> {11}; subgraph cluster_6 { @@ -56,7 +50,6 @@ digraph booleanOperators_kt { 12 [label="Enter class C" style="filled" fillcolor=red]; 13 [label="Exit class C" style="filled" fillcolor=red]; } - 12 -> {13} [color=green]; subgraph cluster_7 { @@ -64,56 +57,54 @@ digraph booleanOperators_kt { 14 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue - 15 [label="Enter when"]; + 16 [label="Enter when"]; subgraph cluster_9 { color=blue - 16 [label="Enter when branch condition "]; + 18 [label="Enter when branch condition "]; subgraph cluster_10 { color=blue - 17 [label="Enter &&"]; - 18 [label="Access variable R|/x|"]; - 19 [label="Type operator: (R|/x| is R|B|)"]; - 20 [label="Exit left part of &&"]; - 21 [label="Enter right part of &&"]; - 22 [label="Access variable R|/x|"]; - 23 [label="Type operator: (R|/x| is R|C|)"]; - 24 [label="Exit &&"]; + 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 &&"]; } - 25 [label="Exit when branch condition"]; + 27 [label="Exit when branch condition"]; } - 26 [label="Synthetic else branch"]; - 27 [label="Enter when branch result"]; + 38 [label="Synthetic else branch"]; + 28 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 28 [label="Enter block"]; - 29 [label="Access variable R|/x|"]; - 30 [label="Function call: R|/x|.R|/A.foo|()"]; - 31 [label="Access variable R|/x|"]; - 32 [label="Function call: R|/x|.R|/B.bar|()"]; - 33 [label="Access variable R|/x|"]; - 34 [label="Function call: R|/x|.R|/C.baz|()"]; - 35 [label="Exit block"]; + 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"]; } - 36 [label="Exit when branch result"]; - 37 [label="Exit when"]; + 37 [label="Exit when branch result"]; + 17 [label="Exit when"]; } - 38 [label="Exit function test_1" style="filled" fillcolor=red]; + 15 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 14 -> {15}; - 15 -> {16}; - 16 -> {17}; - 17 -> {18}; - 18 -> {19}; - 19 -> {20}; - 20 -> {24 21}; + 14 -> {16}; + 16 -> {18}; + 17 -> {15}; + 18 -> {20}; + 19 -> {27}; + 20 -> {21}; 21 -> {22}; 22 -> {23}; - 23 -> {24}; + 23 -> {19 24}; 24 -> {25}; - 25 -> {27 26}; - 26 -> {37}; - 27 -> {28}; + 25 -> {26}; + 26 -> {19}; + 27 -> {28 38}; 28 -> {29}; 29 -> {30}; 30 -> {31}; @@ -123,63 +114,62 @@ digraph booleanOperators_kt { 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {38}; + 37 -> {17}; + 38 -> {17}; subgraph cluster_12 { color=red 39 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_13 { color=blue - 40 [label="Enter when"]; + 41 [label="Enter when"]; subgraph cluster_14 { color=blue - 41 [label="Enter when branch condition "]; + 43 [label="Enter when branch condition "]; subgraph cluster_15 { color=blue - 42 [label="Enter ||"]; - 43 [label="Access variable R|/x|"]; - 44 [label="Type operator: (R|/x| is R|B|)"]; - 45 [label="Exit left part of ||"]; - 46 [label="Enter right part of ||"]; - 47 [label="Access variable R|/x|"]; - 48 [label="Type operator: (R|/x| is R|C|)"]; - 49 [label="Exit ||"]; + 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 ||"]; } - 50 [label="Exit when branch condition"]; + 52 [label="Exit when branch condition"]; } - 51 [label="Synthetic else branch"]; - 52 [label="Enter when branch result"]; + 63 [label="Synthetic else branch"]; + 53 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 53 [label="Enter block"]; - 54 [label="Access variable R|/x|"]; - 55 [label="Function call: R|/x|.R|/A.foo|()"]; - 56 [label="Access variable R|/x|"]; - 57 [label="Function call: R|/x|.#()"]; - 58 [label="Access variable R|/x|"]; - 59 [label="Function call: R|/x|.#()"]; - 60 [label="Exit block"]; + 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"]; } - 61 [label="Exit when branch result"]; - 62 [label="Exit when"]; + 62 [label="Exit when branch result"]; + 42 [label="Exit when"]; } - 63 [label="Exit function test_2" style="filled" fillcolor=red]; + 40 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 39 -> {40}; - 40 -> {41}; - 41 -> {42}; - 42 -> {43}; - 43 -> {44}; - 44 -> {45}; - 45 -> {49 46}; + 39 -> {41}; + 41 -> {43}; + 42 -> {40}; + 43 -> {45}; + 44 -> {52}; + 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {49}; + 48 -> {44 49}; 49 -> {50}; - 50 -> {52 51}; - 51 -> {62}; - 52 -> {53}; + 50 -> {51}; + 51 -> {44}; + 52 -> {53 63}; 53 -> {54}; 54 -> {55}; 55 -> {56}; @@ -189,672 +179,661 @@ digraph booleanOperators_kt { 59 -> {60}; 60 -> {61}; 61 -> {62}; - 62 -> {63}; + 62 -> {42}; + 63 -> {42}; subgraph cluster_17 { color=red 64 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_18 { color=blue - 65 [label="Enter when"]; + 66 [label="Enter when"]; subgraph cluster_19 { color=blue - 66 [label="Enter when branch condition "]; - 67 [label="Access variable R|/x|"]; - 68 [label="Type operator: (R|/x| !is R|A|)"]; - 69 [label="Function call: (R|/x| !is R|A|).R|kotlin/Boolean.not|()"]; - 70 [label="Exit when branch condition"]; + 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="Synthetic else branch"]; - 72 [label="Enter when branch result"]; + 79 [label="Synthetic else branch"]; + 73 [label="Enter when branch result"]; subgraph cluster_20 { color=blue - 73 [label="Enter block"]; - 74 [label="Access variable R|/x|"]; - 75 [label="Function call: R|/x|.R|/A.foo|()"]; - 76 [label="Exit block"]; + 74 [label="Enter block"]; + 75 [label="Access variable R|/x|"]; + 76 [label="Function call: R|/x|.R|/A.foo|()"]; + 77 [label="Exit block"]; } - 77 [label="Exit when branch result"]; - 78 [label="Exit when"]; + 78 [label="Exit when branch result"]; + 67 [label="Exit when"]; } - 79 [label="Exit function test_3" style="filled" fillcolor=red]; + 65 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 64 -> {65}; - 65 -> {66}; - 66 -> {67}; - 67 -> {68}; + 64 -> {66}; + 66 -> {68}; + 67 -> {65}; 68 -> {69}; 69 -> {70}; - 70 -> {72 71}; - 71 -> {78}; - 72 -> {73}; + 70 -> {71}; + 71 -> {72}; + 72 -> {73 79}; 73 -> {74}; 74 -> {75}; 75 -> {76}; 76 -> {77}; 77 -> {78}; - 78 -> {79}; + 78 -> {67}; + 79 -> {67}; subgraph cluster_21 { color=red 80 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_22 { color=blue - 81 [label="Enter when"]; + 82 [label="Enter when"]; subgraph cluster_23 { color=blue - 82 [label="Enter when branch condition "]; + 84 [label="Enter when branch condition "]; subgraph cluster_24 { color=blue - 83 [label="Enter ||"]; - 84 [label="Access variable R|/x|"]; - 85 [label="Type operator: (R|/x| !is R|kotlin/String|)"]; - 86 [label="Exit left part of ||"]; - 87 [label="Enter right part of ||"]; - 88 [label="Access variable R|/x|"]; - 89 [label="Access variable R|kotlin/String.length|"]; - 90 [label="Const: Int(0)"]; - 91 [label="Operator =="]; - 92 [label="Exit ||"]; + 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 ||"]; } - 93 [label="Exit when branch condition"]; + 95 [label="Exit when branch condition"]; } - 94 [label="Synthetic else branch"]; - 95 [label="Enter when branch result"]; + 102 [label="Synthetic else branch"]; + 96 [label="Enter when branch result"]; subgraph cluster_25 { color=blue - 96 [label="Enter block"]; - 97 [label="Access variable R|/x|"]; - 98 [label="Access variable #"]; - 99 [label="Exit block"]; + 97 [label="Enter block"]; + 98 [label="Access variable R|/x|"]; + 99 [label="Access variable #"]; + 100 [label="Exit block"]; } - 100 [label="Exit when branch result"]; - 101 [label="Exit when"]; + 101 [label="Exit when branch result"]; + 83 [label="Exit when"]; } - 102 [label="Access variable R|/x|"]; - 103 [label="Access variable #"]; - 104 [label="Exit function test_4" style="filled" fillcolor=red]; + 103 [label="Access variable R|/x|"]; + 104 [label="Access variable #"]; + 81 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 80 -> {81}; - 81 -> {82}; - 82 -> {83}; - 83 -> {84}; - 84 -> {85}; - 85 -> {86}; - 86 -> {92 87}; + 80 -> {82}; + 82 -> {84}; + 83 -> {103}; + 84 -> {86}; + 85 -> {95}; + 86 -> {87}; 87 -> {88}; 88 -> {89}; - 89 -> {90}; + 89 -> {85 90}; 90 -> {91}; 91 -> {92}; 92 -> {93}; - 93 -> {95 94}; - 94 -> {101}; - 95 -> {96}; + 93 -> {94}; + 94 -> {85}; + 95 -> {96 102}; 96 -> {97}; 97 -> {98}; 98 -> {99}; 99 -> {100}; 100 -> {101}; - 101 -> {102}; - 102 -> {103}; + 101 -> {83}; + 102 -> {83}; 103 -> {104}; + 104 -> {81}; subgraph cluster_26 { color=red 105 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_27 { color=blue - 106 [label="Enter when"]; + 107 [label="Enter when"]; subgraph cluster_28 { color=blue - 107 [label="Enter when branch condition "]; + 109 [label="Enter when branch condition "]; subgraph cluster_29 { color=blue - 108 [label="Enter &&"]; - 109 [label="Access variable R|/x|"]; - 110 [label="Type operator: (R|/x| is R|A|)"]; - 111 [label="Exit left part of &&"]; - 112 [label="Enter right part of &&"]; - 113 [label="Access variable R|/x|"]; - 114 [label="Function call: R|/x|.R|/A.bool|()"]; - 115 [label="Exit &&"]; + 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 &&"]; } - 116 [label="Exit when branch condition"]; + 118 [label="Exit when branch condition"]; } - 117 [label="Synthetic else branch"]; - 118 [label="Enter when branch result"]; + 125 [label="Synthetic else branch"]; + 119 [label="Enter when branch result"]; subgraph cluster_30 { 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"]; + 120 [label="Enter block"]; + 121 [label="Access variable R|/x|"]; + 122 [label="Function call: R|/x|.R|/A.foo|()"]; + 123 [label="Exit block"]; } - 123 [label="Exit when branch result"]; - 124 [label="Exit when"]; + 124 [label="Exit when branch result"]; + 108 [label="Exit when"]; } - 125 [label="Exit function test_5" style="filled" fillcolor=red]; + 106 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 105 -> {106}; - 106 -> {107}; - 107 -> {108}; - 108 -> {109}; - 109 -> {110}; - 110 -> {111}; - 111 -> {115 112}; + 105 -> {107}; + 107 -> {109}; + 108 -> {106}; + 109 -> {111}; + 110 -> {118}; + 111 -> {112}; 112 -> {113}; 113 -> {114}; - 114 -> {115}; + 114 -> {110 115}; 115 -> {116}; - 116 -> {118 117}; - 117 -> {124}; - 118 -> {119}; + 116 -> {117}; + 117 -> {110}; + 118 -> {119 125}; 119 -> {120}; 120 -> {121}; 121 -> {122}; 122 -> {123}; 123 -> {124}; - 124 -> {125}; + 124 -> {108}; + 125 -> {108}; subgraph cluster_31 { color=red 126 [label="Enter function test_6" style="filled" fillcolor=red]; subgraph cluster_32 { color=blue - 127 [label="Enter when"]; + 128 [label="Enter when"]; subgraph cluster_33 { color=blue - 128 [label="Enter when branch condition "]; - 129 [label="Access variable R|/x|"]; - 130 [label="Type operator: (R|/x| !is R|A|)"]; - 131 [label="Function call: (R|/x| !is R|A|).R|kotlin/Boolean.not|()"]; - 132 [label="Exit when branch condition"]; + 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"]; } - 133 [label="Synthetic else branch"]; - 134 [label="Enter when branch result"]; + 141 [label="Synthetic else branch"]; + 135 [label="Enter when branch result"]; subgraph cluster_34 { color=blue - 135 [label="Enter block"]; - 136 [label="Access variable R|/x|"]; - 137 [label="Function call: R|/x|.R|/A.foo|()"]; - 138 [label="Exit block"]; + 136 [label="Enter block"]; + 137 [label="Access variable R|/x|"]; + 138 [label="Function call: R|/x|.R|/A.foo|()"]; + 139 [label="Exit block"]; } - 139 [label="Exit when branch result"]; - 140 [label="Exit when"]; + 140 [label="Exit when branch result"]; + 129 [label="Exit when"]; } - 141 [label="Exit function test_6" style="filled" fillcolor=red]; + 127 [label="Exit function test_6" style="filled" fillcolor=red]; } - - 126 -> {127}; - 127 -> {128}; - 128 -> {129}; - 129 -> {130}; + 126 -> {128}; + 128 -> {130}; + 129 -> {127}; 130 -> {131}; 131 -> {132}; - 132 -> {134 133}; - 133 -> {140}; - 134 -> {135}; + 132 -> {133}; + 133 -> {134}; + 134 -> {135 141}; 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; 139 -> {140}; - 140 -> {141}; + 140 -> {129}; + 141 -> {129}; subgraph cluster_35 { color=red 142 [label="Enter function test_7" style="filled" fillcolor=red]; subgraph cluster_36 { color=blue - 143 [label="Enter when"]; + 144 [label="Enter when"]; subgraph cluster_37 { color=blue - 144 [label="Enter when branch condition "]; + 146 [label="Enter when branch condition "]; subgraph cluster_38 { color=blue - 145 [label="Enter ||"]; - 146 [label="Access variable R|/x|"]; - 147 [label="Type operator: (R|/x| is R|A|)"]; - 148 [label="Exit left part of ||"]; - 149 [label="Enter right part of ||"]; - 150 [label="Const: Boolean(false)"]; - 151 [label="Exit ||"]; + 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 ||"]; } - 152 [label="Exit when branch condition"]; + 154 [label="Exit when branch condition"]; } - 153 [label="Synthetic else branch"]; - 154 [label="Enter when branch result"]; + 161 [label="Synthetic else branch"]; + 155 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 155 [label="Enter block"]; - 156 [label="Access variable R|/x|"]; - 157 [label="Function call: R|/x|.#()"]; - 158 [label="Exit block"]; + 156 [label="Enter block"]; + 157 [label="Access variable R|/x|"]; + 158 [label="Function call: R|/x|.#()"]; + 159 [label="Exit block"]; } - 159 [label="Exit when branch result"]; - 160 [label="Exit when"]; + 160 [label="Exit when branch result"]; + 145 [label="Exit when"]; } - 161 [label="Exit function test_7" style="filled" fillcolor=red]; + 143 [label="Exit function test_7" style="filled" fillcolor=red]; } - - 142 -> {143}; - 143 -> {144}; - 144 -> {145}; - 145 -> {146}; - 146 -> {147}; - 147 -> {148}; - 148 -> {151 149}; + 142 -> {144}; + 144 -> {146}; + 145 -> {143}; + 146 -> {148}; + 147 -> {154}; + 148 -> {149}; 149 -> {150}; 150 -> {151}; - 151 -> {152}; - 152 -> {154 153}; - 153 -> {160}; - 154 -> {155}; + 151 -> {147 152}; + 152 -> {153}; + 153 -> {147}; + 154 -> {155 161}; 155 -> {156}; 156 -> {157}; 157 -> {158}; 158 -> {159}; 159 -> {160}; - 160 -> {161}; + 160 -> {145}; + 161 -> {145}; subgraph cluster_40 { color=red 162 [label="Enter function test_8" style="filled" fillcolor=red]; subgraph cluster_41 { color=blue - 163 [label="Enter when"]; + 164 [label="Enter when"]; subgraph cluster_42 { color=blue - 164 [label="Enter when branch condition "]; + 166 [label="Enter when branch condition "]; subgraph cluster_43 { color=blue - 165 [label="Enter ||"]; - 166 [label="Const: Boolean(false)"]; - 167 [label="Exit left part of ||"]; - 168 [label="Enter right part of ||"]; - 169 [label="Access variable R|/x|"]; - 170 [label="Type operator: (R|/x| is R|A|)"]; - 171 [label="Exit ||"]; + 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 ||"]; } - 172 [label="Exit when branch condition"]; + 174 [label="Exit when branch condition"]; } - 173 [label="Synthetic else branch"]; - 174 [label="Enter when branch result"]; + 181 [label="Synthetic else branch"]; + 175 [label="Enter when branch result"]; subgraph cluster_44 { color=blue - 175 [label="Enter block"]; - 176 [label="Access variable R|/x|"]; - 177 [label="Function call: R|/x|.#()"]; - 178 [label="Exit block"]; + 176 [label="Enter block"]; + 177 [label="Access variable R|/x|"]; + 178 [label="Function call: R|/x|.#()"]; + 179 [label="Exit block"]; } - 179 [label="Exit when branch result"]; - 180 [label="Exit when"]; + 180 [label="Exit when branch result"]; + 165 [label="Exit when"]; } - 181 [label="Exit function test_8" style="filled" fillcolor=red]; + 163 [label="Exit function test_8" style="filled" fillcolor=red]; } - - 162 -> {163}; - 163 -> {164}; - 164 -> {165}; - 165 -> {166}; - 166 -> {167}; - 167 -> {168}; - 167 -> {171} [style=dotted]; + 162 -> {164}; + 164 -> {166}; + 165 -> {163}; + 166 -> {168}; + 167 -> {174}; 168 -> {169}; 169 -> {170}; 170 -> {171}; + 170 -> {167} [style=dotted]; 171 -> {172}; - 172 -> {174 173}; - 173 -> {180}; - 174 -> {175}; + 172 -> {173}; + 173 -> {167}; + 174 -> {175 181}; 175 -> {176}; 176 -> {177}; 177 -> {178}; 178 -> {179}; 179 -> {180}; - 180 -> {181}; + 180 -> {165}; + 181 -> {165}; subgraph cluster_45 { color=red 182 [label="Enter function test_9" style="filled" fillcolor=red]; subgraph cluster_46 { color=blue - 183 [label="Enter when"]; + 184 [label="Enter when"]; subgraph cluster_47 { color=blue - 184 [label="Enter when branch condition "]; + 186 [label="Enter when branch condition "]; subgraph cluster_48 { color=blue - 185 [label="Enter ||"]; - 186 [label="Access variable R|/x|"]; - 187 [label="Type operator: (R|/x| is R|A|)"]; - 188 [label="Exit left part of ||"]; - 189 [label="Enter right part of ||"]; - 190 [label="Const: Boolean(true)"]; - 191 [label="Exit ||"]; + 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 ||"]; } - 192 [label="Exit when branch condition"]; + 194 [label="Exit when branch condition"]; } - 193 [label="Synthetic else branch"]; - 194 [label="Enter when branch result"]; + 201 [label="Synthetic else branch"]; + 195 [label="Enter when branch result"]; subgraph cluster_49 { color=blue - 195 [label="Enter block"]; - 196 [label="Access variable R|/x|"]; - 197 [label="Function call: R|/x|.#()"]; - 198 [label="Exit block"]; + 196 [label="Enter block"]; + 197 [label="Access variable R|/x|"]; + 198 [label="Function call: R|/x|.#()"]; + 199 [label="Exit block"]; } - 199 [label="Exit when branch result"]; - 200 [label="Exit when"]; + 200 [label="Exit when branch result"]; + 185 [label="Exit when"]; } - 201 [label="Exit function test_9" style="filled" fillcolor=red]; + 183 [label="Exit function test_9" style="filled" fillcolor=red]; } - - 182 -> {183}; - 183 -> {184}; - 184 -> {185}; - 185 -> {186}; - 186 -> {187}; - 187 -> {188}; - 188 -> {191 189}; + 182 -> {184}; + 184 -> {186}; + 185 -> {183}; + 186 -> {188}; + 187 -> {194}; + 188 -> {189}; 189 -> {190}; 190 -> {191}; - 191 -> {192}; - 192 -> {194 193}; - 193 -> {200}; - 194 -> {195}; + 191 -> {187 192}; + 192 -> {193}; + 193 -> {187}; + 194 -> {195 201}; 195 -> {196}; 196 -> {197}; 197 -> {198}; 198 -> {199}; 199 -> {200}; - 200 -> {201}; + 200 -> {185}; + 201 -> {185}; subgraph cluster_50 { color=red 202 [label="Enter function test_10" style="filled" fillcolor=red]; subgraph cluster_51 { color=blue - 203 [label="Enter when"]; + 204 [label="Enter when"]; subgraph cluster_52 { color=blue - 204 [label="Enter when branch condition "]; + 206 [label="Enter when branch condition "]; subgraph cluster_53 { color=blue - 205 [label="Enter ||"]; - 206 [label="Const: Boolean(true)"]; - 207 [label="Exit left part of ||"]; - 208 [label="Enter right part of ||" style="filled" fillcolor=gray]; - 209 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 210 [label="Type operator: (R|/x| is R|A|)" style="filled" fillcolor=gray]; - 211 [label="Exit ||"]; + 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 ||"]; } - 212 [label="Exit when branch condition"]; + 214 [label="Exit when branch condition"]; } - 213 [label="Synthetic else branch"]; - 214 [label="Enter when branch result"]; + 221 [label="Synthetic else branch"]; + 215 [label="Enter when branch result"]; subgraph cluster_54 { color=blue - 215 [label="Enter block"]; - 216 [label="Access variable R|/x|"]; - 217 [label="Function call: R|/x|.#()"]; - 218 [label="Exit block"]; + 216 [label="Enter block"]; + 217 [label="Access variable R|/x|"]; + 218 [label="Function call: R|/x|.#()"]; + 219 [label="Exit block"]; } - 219 [label="Exit when branch result"]; - 220 [label="Exit when"]; + 220 [label="Exit when branch result"]; + 205 [label="Exit when"]; } - 221 [label="Exit function test_10" style="filled" fillcolor=red]; + 203 [label="Exit function test_10" style="filled" fillcolor=red]; } - - 202 -> {203}; - 203 -> {204}; - 204 -> {205}; - 205 -> {206}; - 206 -> {207}; - 207 -> {211}; - 207 -> {208} [style=dotted]; - 208 -> {209} [style=dotted]; - 209 -> {210} [style=dotted]; + 202 -> {204}; + 204 -> {206}; + 205 -> {203}; + 206 -> {208}; + 207 -> {214}; + 208 -> {209}; + 209 -> {210}; + 210 -> {207}; 210 -> {211} [style=dotted]; - 211 -> {212}; - 212 -> {214 213}; - 213 -> {220}; - 214 -> {215}; + 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 -> {221}; + 220 -> {205}; + 221 -> {205}; subgraph cluster_55 { color=red 222 [label="Enter function test_11" style="filled" fillcolor=red]; subgraph cluster_56 { color=blue - 223 [label="Enter when"]; + 224 [label="Enter when"]; subgraph cluster_57 { color=blue - 224 [label="Enter when branch condition "]; + 226 [label="Enter when branch condition "]; subgraph cluster_58 { color=blue - 225 [label="Enter &&"]; - 226 [label="Const: Boolean(false)"]; - 227 [label="Exit left part of &&"]; - 228 [label="Enter right part of &&" style="filled" fillcolor=gray]; - 229 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 230 [label="Type operator: (R|/x| is R|A|)" style="filled" fillcolor=gray]; - 231 [label="Exit &&"]; + 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 &&"]; } - 232 [label="Exit when branch condition"]; + 234 [label="Exit when branch condition"]; } - 233 [label="Synthetic else branch"]; - 234 [label="Enter when branch result"]; + 241 [label="Synthetic else branch"]; + 235 [label="Enter when branch result"]; subgraph cluster_59 { color=blue - 235 [label="Enter block"]; - 236 [label="Access variable R|/x|"]; - 237 [label="Function call: R|/x|.#()"]; - 238 [label="Exit block"]; + 236 [label="Enter block"]; + 237 [label="Access variable R|/x|"]; + 238 [label="Function call: R|/x|.#()"]; + 239 [label="Exit block"]; } - 239 [label="Exit when branch result"]; - 240 [label="Exit when"]; + 240 [label="Exit when branch result"]; + 225 [label="Exit when"]; } - 241 [label="Exit function test_11" style="filled" fillcolor=red]; + 223 [label="Exit function test_11" style="filled" fillcolor=red]; } - - 222 -> {223}; - 223 -> {224}; - 224 -> {225}; - 225 -> {226}; - 226 -> {227}; - 227 -> {231}; - 227 -> {228} [style=dotted]; - 228 -> {229} [style=dotted]; - 229 -> {230} [style=dotted]; + 222 -> {224}; + 224 -> {226}; + 225 -> {223}; + 226 -> {228}; + 227 -> {234}; + 228 -> {229}; + 229 -> {230}; + 230 -> {227}; 230 -> {231} [style=dotted]; - 231 -> {232}; - 232 -> {234 233}; - 233 -> {240}; - 234 -> {235}; + 231 -> {232} [style=dotted]; + 232 -> {233} [style=dotted]; + 233 -> {227} [style=dotted]; + 234 -> {235 241}; 235 -> {236}; 236 -> {237}; 237 -> {238}; 238 -> {239}; 239 -> {240}; - 240 -> {241}; + 240 -> {225}; + 241 -> {225}; subgraph cluster_60 { color=red 242 [label="Enter function test_12" style="filled" fillcolor=red]; subgraph cluster_61 { color=blue - 243 [label="Enter when"]; + 244 [label="Enter when"]; subgraph cluster_62 { color=blue - 244 [label="Enter when branch condition "]; + 246 [label="Enter when branch condition "]; subgraph cluster_63 { color=blue - 245 [label="Enter &&"]; - 246 [label="Access variable R|/x|"]; - 247 [label="Type operator: (R|/x| is R|A|)"]; - 248 [label="Exit left part of &&"]; - 249 [label="Enter right part of &&"]; - 250 [label="Const: Boolean(false)"]; - 251 [label="Exit &&"]; + 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 &&"]; } - 252 [label="Exit when branch condition"]; + 254 [label="Exit when branch condition"]; } - 253 [label="Synthetic else branch"]; - 254 [label="Enter when branch result"]; + 261 [label="Synthetic else branch"]; + 255 [label="Enter when branch result"]; subgraph cluster_64 { color=blue - 255 [label="Enter block"]; - 256 [label="Access variable R|/x|"]; - 257 [label="Function call: R|/x|.R|/A.foo|()"]; - 258 [label="Exit block"]; + 256 [label="Enter block"]; + 257 [label="Access variable R|/x|"]; + 258 [label="Function call: R|/x|.R|/A.foo|()"]; + 259 [label="Exit block"]; } - 259 [label="Exit when branch result"]; - 260 [label="Exit when"]; + 260 [label="Exit when branch result"]; + 245 [label="Exit when"]; } - 261 [label="Exit function test_12" style="filled" fillcolor=red]; + 243 [label="Exit function test_12" style="filled" fillcolor=red]; } - - 242 -> {243}; - 243 -> {244}; - 244 -> {245}; - 245 -> {246}; - 246 -> {247}; - 247 -> {248}; - 248 -> {251 249}; + 242 -> {244}; + 244 -> {246}; + 245 -> {243}; + 246 -> {248}; + 247 -> {254}; + 248 -> {249}; 249 -> {250}; 250 -> {251}; - 251 -> {252}; - 252 -> {254 253}; - 253 -> {260}; - 254 -> {255}; + 251 -> {247 252}; + 252 -> {253}; + 253 -> {247}; + 254 -> {255 261}; 255 -> {256}; 256 -> {257}; 257 -> {258}; 258 -> {259}; 259 -> {260}; - 260 -> {261}; + 260 -> {245}; + 261 -> {245}; subgraph cluster_65 { color=red 262 [label="Enter function test_13" style="filled" fillcolor=red]; subgraph cluster_66 { color=blue - 263 [label="Enter when"]; + 264 [label="Enter when"]; subgraph cluster_67 { color=blue - 264 [label="Enter when branch condition "]; + 266 [label="Enter when branch condition "]; subgraph cluster_68 { color=blue - 265 [label="Enter &&"]; - 266 [label="Const: Boolean(true)"]; - 267 [label="Exit left part of &&"]; - 268 [label="Enter right part of &&"]; - 269 [label="Access variable R|/x|"]; - 270 [label="Type operator: (R|/x| is R|A|)"]; - 271 [label="Exit &&"]; + 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 &&"]; } - 272 [label="Exit when branch condition"]; + 274 [label="Exit when branch condition"]; } - 273 [label="Synthetic else branch"]; - 274 [label="Enter when branch result"]; + 281 [label="Synthetic else branch"]; + 275 [label="Enter when branch result"]; subgraph cluster_69 { color=blue - 275 [label="Enter block"]; - 276 [label="Access variable R|/x|"]; - 277 [label="Function call: R|/x|.R|/A.foo|()"]; - 278 [label="Exit block"]; + 276 [label="Enter block"]; + 277 [label="Access variable R|/x|"]; + 278 [label="Function call: R|/x|.R|/A.foo|()"]; + 279 [label="Exit block"]; } - 279 [label="Exit when branch result"]; - 280 [label="Exit when"]; + 280 [label="Exit when branch result"]; + 265 [label="Exit when"]; } - 281 [label="Exit function test_13" style="filled" fillcolor=red]; + 263 [label="Exit function test_13" style="filled" fillcolor=red]; } - - 262 -> {263}; - 263 -> {264}; - 264 -> {265}; - 265 -> {266}; - 266 -> {267}; - 267 -> {268}; - 267 -> {271} [style=dotted]; + 262 -> {264}; + 264 -> {266}; + 265 -> {263}; + 266 -> {268}; + 267 -> {274}; 268 -> {269}; 269 -> {270}; 270 -> {271}; + 270 -> {267} [style=dotted]; 271 -> {272}; - 272 -> {274 273}; - 273 -> {280}; - 274 -> {275}; + 272 -> {273}; + 273 -> {267}; + 274 -> {275 281}; 275 -> {276}; 276 -> {277}; 277 -> {278}; 278 -> {279}; 279 -> {280}; - 280 -> {281}; + 280 -> {265}; + 281 -> {265}; subgraph cluster_70 { color=red 282 [label="Enter function test_14" style="filled" fillcolor=red]; subgraph cluster_71 { color=blue - 283 [label="Enter when"]; + 284 [label="Enter when"]; subgraph cluster_72 { color=blue - 284 [label="Enter when branch condition "]; + 286 [label="Enter when branch condition "]; subgraph cluster_73 { color=blue - 285 [label="Enter &&"]; - 286 [label="Access variable R|/x|"]; - 287 [label="Type operator: (R|/x| is R|A|)"]; - 288 [label="Exit left part of &&"]; - 289 [label="Enter right part of &&"]; - 290 [label="Const: Boolean(false)"]; - 291 [label="Exit &&"]; + 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 &&"]; } - 292 [label="Exit when branch condition"]; + 294 [label="Exit when branch condition"]; } - 293 [label="Synthetic else branch"]; - 294 [label="Enter when branch result"]; + 301 [label="Synthetic else branch"]; + 295 [label="Enter when branch result"]; subgraph cluster_74 { color=blue - 295 [label="Enter block"]; - 296 [label="Access variable R|/x|"]; - 297 [label="Function call: R|/x|.R|/A.foo|()"]; - 298 [label="Exit block"]; + 296 [label="Enter block"]; + 297 [label="Access variable R|/x|"]; + 298 [label="Function call: R|/x|.R|/A.foo|()"]; + 299 [label="Exit block"]; } - 299 [label="Exit when branch result"]; - 300 [label="Exit when"]; + 300 [label="Exit when branch result"]; + 285 [label="Exit when"]; } - 301 [label="Exit function test_14" style="filled" fillcolor=red]; + 283 [label="Exit function test_14" style="filled" fillcolor=red]; } - - 282 -> {283}; - 283 -> {284}; - 284 -> {285}; - 285 -> {286}; - 286 -> {287}; - 287 -> {288}; - 288 -> {291 289}; + 282 -> {284}; + 284 -> {286}; + 285 -> {283}; + 286 -> {288}; + 287 -> {294}; + 288 -> {289}; 289 -> {290}; 290 -> {291}; - 291 -> {292}; - 292 -> {294 293}; - 293 -> {300}; - 294 -> {295}; + 291 -> {287 292}; + 292 -> {293}; + 293 -> {287}; + 294 -> {295 301}; 295 -> {296}; 296 -> {297}; 297 -> {298}; 298 -> {299}; 299 -> {300}; - 300 -> {301}; + 300 -> {285}; + 301 -> {285}; } 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 138c79f8a5e..a2eed9f2f9e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot @@ -8,7 +8,6 @@ digraph equalsToBoolean_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,85 +15,81 @@ digraph equalsToBoolean_kt { 2 [label="Enter function getter" style="filled" fillcolor=red]; 3 [label="Exit function getter" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { - color=red - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Exit property" style="filled" fillcolor=red]; - } - - 4 -> {5}; - - subgraph cluster_3 { color=red 6 [label="Enter class A" 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]; } - + 6 -> {4} [color=green]; + 4 -> {5}; + 5 -> {7} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 9 [label="Enter when"]; + 10 [label="Enter when"]; subgraph cluster_6 { color=blue - 10 [label="Enter when branch condition "]; - 11 [label="Access variable R|/b|"]; - 12 [label="Const: Boolean(true)"]; - 13 [label="Operator =="]; + 12 [label="Enter when branch condition "]; + 13 [label="Access variable R|/b|"]; 14 [label="Const: Boolean(true)"]; 15 [label="Operator =="]; - 16 [label="Exit when branch condition"]; + 16 [label="Const: Boolean(true)"]; + 17 [label="Operator =="]; + 18 [label="Exit when branch condition"]; } subgraph cluster_7 { color=blue - 17 [label="Enter when branch condition else"]; - 18 [label="Exit when branch condition"]; + 25 [label="Enter when branch condition else"]; + 26 [label="Exit when branch condition"]; } - 19 [label="Enter when branch result"]; + 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|.#()"]; + 22 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; 23 [label="Exit block"]; } 24 [label="Exit when branch result"]; - 25 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 26 [label="Enter block"]; - 27 [label="Access variable R|/b|"]; - 28 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 29 [label="Exit block"]; - } - 30 [label="Exit when branch result"]; - 31 [label="Exit when"]; + 11 [label="Exit when"]; } - 32 [label="Exit function test_1" style="filled" fillcolor=red]; + 9 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; + 8 -> {10}; + 10 -> {12}; + 11 -> {9}; 12 -> {13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; - 16 -> {25 17}; + 16 -> {17}; 17 -> {18}; - 18 -> {19}; + 18 -> {19 25}; 19 -> {20}; 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; - 24 -> {31}; + 24 -> {11}; 25 -> {26}; 26 -> {27}; 27 -> {28}; @@ -102,68 +97,67 @@ digraph equalsToBoolean_kt { 29 -> {30}; 30 -> {31}; 31 -> {32}; + 32 -> {11}; subgraph cluster_10 { color=red 33 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_11 { color=blue - 34 [label="Enter when"]; + 35 [label="Enter when"]; subgraph cluster_12 { color=blue - 35 [label="Enter when branch condition "]; - 36 [label="Access variable R|/b|"]; - 37 [label="Const: Boolean(true)"]; - 38 [label="Operator =="]; + 37 [label="Enter when branch condition "]; + 38 [label="Access variable R|/b|"]; 39 [label="Const: Boolean(true)"]; - 40 [label="Operator !="]; - 41 [label="Exit when branch condition"]; + 40 [label="Operator =="]; + 41 [label="Const: Boolean(true)"]; + 42 [label="Operator !="]; + 43 [label="Exit when branch condition"]; } subgraph cluster_13 { color=blue - 42 [label="Enter when branch condition else"]; - 43 [label="Exit when branch condition"]; + 50 [label="Enter when branch condition else"]; + 51 [label="Exit when branch condition"]; } - 44 [label="Enter when branch result"]; + 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|.R|kotlin/Boolean.not|()"]; + 47 [label="Function call: R|/b|.#()"]; 48 [label="Exit block"]; } 49 [label="Exit when branch result"]; - 50 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 51 [label="Enter block"]; - 52 [label="Access variable R|/b|"]; - 53 [label="Function call: R|/b|.#()"]; - 54 [label="Exit block"]; - } - 55 [label="Exit when branch result"]; - 56 [label="Exit when"]; + 36 [label="Exit when"]; } - 57 [label="Exit function test_2" style="filled" fillcolor=red]; + 34 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 33 -> {34}; - 34 -> {35}; - 35 -> {36}; - 36 -> {37}; + 33 -> {35}; + 35 -> {37}; + 36 -> {34}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; - 41 -> {50 42}; + 41 -> {42}; 42 -> {43}; - 43 -> {44}; + 43 -> {44 50}; 44 -> {45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; 48 -> {49}; - 49 -> {56}; + 49 -> {36}; 50 -> {51}; 51 -> {52}; 52 -> {53}; @@ -171,68 +165,67 @@ digraph equalsToBoolean_kt { 54 -> {55}; 55 -> {56}; 56 -> {57}; + 57 -> {36}; subgraph cluster_16 { color=red 58 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_17 { color=blue - 59 [label="Enter when"]; + 60 [label="Enter when"]; subgraph cluster_18 { color=blue - 60 [label="Enter when branch condition "]; - 61 [label="Access variable R|/b|"]; - 62 [label="Const: Boolean(true)"]; - 63 [label="Operator =="]; - 64 [label="Const: Boolean(false)"]; + 62 [label="Enter when branch condition "]; + 63 [label="Access variable R|/b|"]; + 64 [label="Const: Boolean(true)"]; 65 [label="Operator =="]; - 66 [label="Exit when branch condition"]; + 66 [label="Const: Boolean(false)"]; + 67 [label="Operator =="]; + 68 [label="Exit when branch condition"]; } subgraph cluster_19 { color=blue - 67 [label="Enter when branch condition else"]; - 68 [label="Exit when branch condition"]; + 75 [label="Enter when branch condition else"]; + 76 [label="Exit when branch condition"]; } - 69 [label="Enter when branch result"]; + 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|.R|kotlin/Boolean.not|()"]; + 72 [label="Function call: R|/b|.#()"]; 73 [label="Exit block"]; } 74 [label="Exit when branch result"]; - 75 [label="Enter when branch result"]; - subgraph cluster_21 { - color=blue - 76 [label="Enter block"]; - 77 [label="Access variable R|/b|"]; - 78 [label="Function call: R|/b|.#()"]; - 79 [label="Exit block"]; - } - 80 [label="Exit when branch result"]; - 81 [label="Exit when"]; + 61 [label="Exit when"]; } - 82 [label="Exit function test_3" style="filled" fillcolor=red]; + 59 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 58 -> {59}; - 59 -> {60}; - 60 -> {61}; - 61 -> {62}; + 58 -> {60}; + 60 -> {62}; + 61 -> {59}; 62 -> {63}; 63 -> {64}; 64 -> {65}; 65 -> {66}; - 66 -> {75 67}; + 66 -> {67}; 67 -> {68}; - 68 -> {69}; + 68 -> {69 75}; 69 -> {70}; 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; - 74 -> {81}; + 74 -> {61}; 75 -> {76}; 76 -> {77}; 77 -> {78}; @@ -240,68 +233,67 @@ digraph equalsToBoolean_kt { 79 -> {80}; 80 -> {81}; 81 -> {82}; + 82 -> {61}; subgraph cluster_22 { color=red 83 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_23 { color=blue - 84 [label="Enter when"]; + 85 [label="Enter when"]; subgraph cluster_24 { color=blue - 85 [label="Enter when branch condition "]; - 86 [label="Access variable R|/b|"]; - 87 [label="Const: Boolean(true)"]; - 88 [label="Operator =="]; - 89 [label="Const: Boolean(false)"]; - 90 [label="Operator !="]; - 91 [label="Exit when branch condition"]; + 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 - 92 [label="Enter when branch condition else"]; - 93 [label="Exit when branch condition"]; + 100 [label="Enter when branch condition else"]; + 101 [label="Exit when branch condition"]; } - 94 [label="Enter when branch result"]; + 102 [label="Enter when branch result"]; 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"]; + } + 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|.#()"]; + 97 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; 98 [label="Exit block"]; } 99 [label="Exit when branch result"]; - 100 [label="Enter when branch result"]; - subgraph cluster_27 { - color=blue - 101 [label="Enter block"]; - 102 [label="Access variable R|/b|"]; - 103 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 104 [label="Exit block"]; - } - 105 [label="Exit when branch result"]; - 106 [label="Exit when"]; + 86 [label="Exit when"]; } - 107 [label="Exit function test_4" style="filled" fillcolor=red]; + 84 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 83 -> {84}; - 84 -> {85}; - 85 -> {86}; - 86 -> {87}; + 83 -> {85}; + 85 -> {87}; + 86 -> {84}; 87 -> {88}; 88 -> {89}; 89 -> {90}; 90 -> {91}; - 91 -> {100 92}; + 91 -> {92}; 92 -> {93}; - 93 -> {94}; + 93 -> {94 100}; 94 -> {95}; 95 -> {96}; 96 -> {97}; 97 -> {98}; 98 -> {99}; - 99 -> {106}; + 99 -> {86}; 100 -> {101}; 101 -> {102}; 102 -> {103}; @@ -309,68 +301,67 @@ digraph equalsToBoolean_kt { 104 -> {105}; 105 -> {106}; 106 -> {107}; + 107 -> {86}; subgraph cluster_28 { color=red 108 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_29 { color=blue - 109 [label="Enter when"]; + 110 [label="Enter when"]; subgraph cluster_30 { color=blue - 110 [label="Enter when branch condition "]; - 111 [label="Access variable R|/b|"]; - 112 [label="Const: Boolean(true)"]; - 113 [label="Operator !="]; + 112 [label="Enter when branch condition "]; + 113 [label="Access variable R|/b|"]; 114 [label="Const: Boolean(true)"]; - 115 [label="Operator =="]; - 116 [label="Exit when branch condition"]; + 115 [label="Operator !="]; + 116 [label="Const: Boolean(true)"]; + 117 [label="Operator =="]; + 118 [label="Exit when branch condition"]; } subgraph cluster_31 { color=blue - 117 [label="Enter when branch condition else"]; - 118 [label="Exit when branch condition"]; + 125 [label="Enter when branch condition else"]; + 126 [label="Exit when branch condition"]; } - 119 [label="Enter when branch result"]; + 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"]; + subgraph cluster_33 { color=blue 120 [label="Enter block"]; 121 [label="Access variable R|/b|"]; - 122 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 122 [label="Function call: R|/b|.#()"]; 123 [label="Exit block"]; } 124 [label="Exit when branch result"]; - 125 [label="Enter when branch result"]; - subgraph cluster_33 { - color=blue - 126 [label="Enter block"]; - 127 [label="Access variable R|/b|"]; - 128 [label="Function call: R|/b|.#()"]; - 129 [label="Exit block"]; - } - 130 [label="Exit when branch result"]; - 131 [label="Exit when"]; + 111 [label="Exit when"]; } - 132 [label="Exit function test_5" style="filled" fillcolor=red]; + 109 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 108 -> {109}; - 109 -> {110}; - 110 -> {111}; - 111 -> {112}; + 108 -> {110}; + 110 -> {112}; + 111 -> {109}; 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; - 116 -> {125 117}; + 116 -> {117}; 117 -> {118}; - 118 -> {119}; + 118 -> {119 125}; 119 -> {120}; 120 -> {121}; 121 -> {122}; 122 -> {123}; 123 -> {124}; - 124 -> {131}; + 124 -> {111}; 125 -> {126}; 126 -> {127}; 127 -> {128}; @@ -378,68 +369,67 @@ digraph equalsToBoolean_kt { 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 - 134 [label="Enter when"]; + 135 [label="Enter when"]; subgraph cluster_36 { color=blue - 135 [label="Enter when branch condition "]; - 136 [label="Access variable R|/b|"]; - 137 [label="Const: Boolean(true)"]; - 138 [label="Operator !="]; + 137 [label="Enter when branch condition "]; + 138 [label="Access variable R|/b|"]; 139 [label="Const: Boolean(true)"]; 140 [label="Operator !="]; - 141 [label="Exit when branch condition"]; + 141 [label="Const: Boolean(true)"]; + 142 [label="Operator !="]; + 143 [label="Exit when branch condition"]; } subgraph cluster_37 { color=blue - 142 [label="Enter when branch condition else"]; - 143 [label="Exit when branch condition"]; + 150 [label="Enter when branch condition else"]; + 151 [label="Exit when branch condition"]; } - 144 [label="Enter when branch result"]; + 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|.#()"]; + 147 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; 148 [label="Exit block"]; } 149 [label="Exit when branch result"]; - 150 [label="Enter when branch result"]; - subgraph cluster_39 { - color=blue - 151 [label="Enter block"]; - 152 [label="Access variable R|/b|"]; - 153 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 154 [label="Exit block"]; - } - 155 [label="Exit when branch result"]; - 156 [label="Exit when"]; + 136 [label="Exit when"]; } - 157 [label="Exit function test_6" style="filled" fillcolor=red]; + 134 [label="Exit function test_6" style="filled" fillcolor=red]; } - - 133 -> {134}; - 134 -> {135}; - 135 -> {136}; - 136 -> {137}; + 133 -> {135}; + 135 -> {137}; + 136 -> {134}; 137 -> {138}; 138 -> {139}; 139 -> {140}; 140 -> {141}; - 141 -> {150 142}; + 141 -> {142}; 142 -> {143}; - 143 -> {144}; + 143 -> {144 150}; 144 -> {145}; 145 -> {146}; 146 -> {147}; 147 -> {148}; 148 -> {149}; - 149 -> {156}; + 149 -> {136}; 150 -> {151}; 151 -> {152}; 152 -> {153}; @@ -447,68 +437,67 @@ digraph equalsToBoolean_kt { 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 - 159 [label="Enter when"]; + 160 [label="Enter when"]; subgraph cluster_42 { color=blue - 160 [label="Enter when branch condition "]; - 161 [label="Access variable R|/b|"]; - 162 [label="Const: Boolean(true)"]; - 163 [label="Operator !="]; - 164 [label="Const: Boolean(false)"]; - 165 [label="Operator =="]; - 166 [label="Exit when branch condition"]; + 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 - 167 [label="Enter when branch condition else"]; - 168 [label="Exit when branch condition"]; + 175 [label="Enter when branch condition else"]; + 176 [label="Exit when branch condition"]; } - 169 [label="Enter when branch result"]; + 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|.#()"]; + 172 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; 173 [label="Exit block"]; } 174 [label="Exit when branch result"]; - 175 [label="Enter when branch result"]; - subgraph cluster_45 { - color=blue - 176 [label="Enter block"]; - 177 [label="Access variable R|/b|"]; - 178 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 179 [label="Exit block"]; - } - 180 [label="Exit when branch result"]; - 181 [label="Exit when"]; + 161 [label="Exit when"]; } - 182 [label="Exit function test_7" style="filled" fillcolor=red]; + 159 [label="Exit function test_7" style="filled" fillcolor=red]; } - - 158 -> {159}; - 159 -> {160}; - 160 -> {161}; - 161 -> {162}; + 158 -> {160}; + 160 -> {162}; + 161 -> {159}; 162 -> {163}; 163 -> {164}; 164 -> {165}; 165 -> {166}; - 166 -> {175 167}; + 166 -> {167}; 167 -> {168}; - 168 -> {169}; + 168 -> {169 175}; 169 -> {170}; 170 -> {171}; 171 -> {172}; 172 -> {173}; 173 -> {174}; - 174 -> {181}; + 174 -> {161}; 175 -> {176}; 176 -> {177}; 177 -> {178}; @@ -516,68 +505,67 @@ digraph equalsToBoolean_kt { 179 -> {180}; 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 - 184 [label="Enter when"]; + 185 [label="Enter when"]; subgraph cluster_48 { color=blue - 185 [label="Enter when branch condition "]; - 186 [label="Access variable R|/b|"]; - 187 [label="Const: Boolean(true)"]; - 188 [label="Operator !="]; - 189 [label="Const: Boolean(false)"]; + 187 [label="Enter when branch condition "]; + 188 [label="Access variable R|/b|"]; + 189 [label="Const: Boolean(true)"]; 190 [label="Operator !="]; - 191 [label="Exit when branch condition"]; + 191 [label="Const: Boolean(false)"]; + 192 [label="Operator !="]; + 193 [label="Exit when branch condition"]; } subgraph cluster_49 { color=blue - 192 [label="Enter when branch condition else"]; - 193 [label="Exit when branch condition"]; + 200 [label="Enter when branch condition else"]; + 201 [label="Exit when branch condition"]; } - 194 [label="Enter when branch result"]; + 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|.R|kotlin/Boolean.not|()"]; + 197 [label="Function call: R|/b|.#()"]; 198 [label="Exit block"]; } 199 [label="Exit when branch result"]; - 200 [label="Enter when branch result"]; - subgraph cluster_51 { - color=blue - 201 [label="Enter block"]; - 202 [label="Access variable R|/b|"]; - 203 [label="Function call: R|/b|.#()"]; - 204 [label="Exit block"]; - } - 205 [label="Exit when branch result"]; - 206 [label="Exit when"]; + 186 [label="Exit when"]; } - 207 [label="Exit function test_8" style="filled" fillcolor=red]; + 184 [label="Exit function test_8" style="filled" fillcolor=red]; } - - 183 -> {184}; - 184 -> {185}; - 185 -> {186}; - 186 -> {187}; + 183 -> {185}; + 185 -> {187}; + 186 -> {184}; 187 -> {188}; 188 -> {189}; 189 -> {190}; 190 -> {191}; - 191 -> {200 192}; + 191 -> {192}; 192 -> {193}; - 193 -> {194}; + 193 -> {194 200}; 194 -> {195}; 195 -> {196}; 196 -> {197}; 197 -> {198}; 198 -> {199}; - 199 -> {206}; + 199 -> {186}; 200 -> {201}; 201 -> {202}; 202 -> {203}; @@ -585,5 +573,6 @@ digraph equalsToBoolean_kt { 204 -> {205}; 205 -> {206}; 206 -> {207}; + 207 -> {186}; } 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 a5226eb270d..ef0bbc63de8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot @@ -8,7 +8,6 @@ digraph jumpFromRhsOfOperator_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph jumpFromRhsOfOperator_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,411 +22,403 @@ digraph jumpFromRhsOfOperator_kt { 4 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 5 [label="Enter ||"]; - 6 [label="Access variable R|/a|"]; - 7 [label="Const: Null(null)"]; - 8 [label="Operator !="]; - 9 [label="Exit left part of ||"]; - 10 [label="Enter right part of ||"]; - 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 ||"]; + 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 ||"]; } - 15 [label="Access variable R|/a|"]; - 16 [label="Function call: R|/a|.R|/A.foo|()"]; - 17 [label="Exit function test_1" style="filled" fillcolor=red]; + 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 -> {5}; - 5 -> {6}; - 6 -> {7}; + 4 -> {7}; + 6 -> {16}; 7 -> {8}; 8 -> {9}; - 9 -> {14 10}; + 9 -> {10}; 10 -> {11}; - 11 -> {12}; - 12 -> {17}; - 12 -> {13} [style=dotted]; - 13 -> {14} [style=dotted]; - 14 -> {15}; - 15 -> {16}; + 11 -> {6 12}; + 12 -> {13}; + 13 -> {14}; + 14 -> {5}; + 14 -> {15} [style=dotted]; + 15 -> {6} [style=dotted]; 16 -> {17}; + 17 -> {5}; subgraph cluster_4 { color=red 18 [label="Enter function teat_2" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 19 [label="Enter &&"]; - 20 [label="Access variable R|/a|"]; - 21 [label="Const: Null(null)"]; - 22 [label="Operator =="]; - 23 [label="Exit left part of &&"]; - 24 [label="Enter right part of &&"]; - 25 [label="Function call: R|java/lang/Exception.Exception|()"]; - 26 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 27 [label="Stub" style="filled" fillcolor=gray]; - 28 [label="Exit &&"]; + 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 &&"]; } - 29 [label="Access variable R|/a|"]; - 30 [label="Function call: R|/a|.R|/A.foo|()"]; - 31 [label="Exit function teat_2" style="filled" fillcolor=red]; + 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]; } - - 18 -> {19}; - 19 -> {20}; - 20 -> {21}; + 18 -> {21}; + 20 -> {30}; 21 -> {22}; 22 -> {23}; - 23 -> {28 24}; + 23 -> {24}; 24 -> {25}; - 25 -> {26}; - 26 -> {31}; - 26 -> {27} [style=dotted]; - 27 -> {28} [style=dotted]; - 28 -> {29}; - 29 -> {30}; + 25 -> {20 26}; + 26 -> {27}; + 27 -> {28}; + 28 -> {19}; + 28 -> {29} [style=dotted]; + 29 -> {20} [style=dotted]; 30 -> {31}; + 31 -> {19}; subgraph cluster_6 { color=red 32 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue - 33 [label="Enter when"]; + 34 [label="Enter when"]; subgraph cluster_8 { color=blue - 34 [label="Enter when branch condition "]; + 36 [label="Enter when branch condition "]; subgraph cluster_9 { color=blue - 35 [label="Enter ||"]; - 36 [label="Access variable R|/a|"]; - 37 [label="Const: Null(null)"]; - 38 [label="Operator !="]; - 39 [label="Exit left part of ||"]; - 40 [label="Enter right part of ||"]; - 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="Exit ||"]; + 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 ||"]; } - 45 [label="Exit when branch condition"]; + 47 [label="Exit when branch condition"]; } - 46 [label="Synthetic else branch"]; - 47 [label="Enter when branch result"]; + 54 [label="Synthetic else branch"]; + 48 [label="Enter when branch result"]; subgraph cluster_10 { color=blue - 48 [label="Enter block"]; - 49 [label="Access variable R|/a|"]; - 50 [label="Function call: R|/a|.R|/A.foo|()"]; - 51 [label="Exit block"]; + 49 [label="Enter block"]; + 50 [label="Access variable R|/a|"]; + 51 [label="Function call: R|/a|.R|/A.foo|()"]; + 52 [label="Exit block"]; } - 52 [label="Exit when branch result"]; - 53 [label="Exit when"]; + 53 [label="Exit when branch result"]; + 35 [label="Exit when"]; } - 54 [label="Access variable R|/a|"]; - 55 [label="Function call: R|/a|.R|/A.foo|()"]; - 56 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - - 32 -> {33}; - 33 -> {34}; - 34 -> {35}; - 35 -> {36}; - 36 -> {37}; - 37 -> {38}; + 32 -> {34}; + 34 -> {36}; + 35 -> {55}; + 36 -> {38}; + 37 -> {47}; 38 -> {39}; - 39 -> {44 40}; + 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {56}; - 42 -> {43} [style=dotted]; - 43 -> {44} [style=dotted]; + 42 -> {37 43}; + 43 -> {44}; 44 -> {45}; - 45 -> {47 46}; - 46 -> {53}; - 47 -> {48}; + 45 -> {33}; + 45 -> {46} [style=dotted]; + 46 -> {37} [style=dotted]; + 47 -> {48 54}; 48 -> {49}; 49 -> {50}; 50 -> {51}; 51 -> {52}; 52 -> {53}; - 53 -> {54}; - 54 -> {55}; + 53 -> {35}; + 54 -> {35}; 55 -> {56}; + 56 -> {33}; subgraph cluster_11 { color=red 57 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_12 { color=blue - 58 [label="Enter when"]; + 59 [label="Enter when"]; subgraph cluster_13 { color=blue - 59 [label="Enter when branch condition "]; + 61 [label="Enter when branch condition "]; subgraph cluster_14 { color=blue - 60 [label="Enter &&"]; - 61 [label="Access variable R|/a|"]; - 62 [label="Const: Null(null)"]; - 63 [label="Operator =="]; - 64 [label="Exit left part of &&"]; - 65 [label="Enter right part of &&"]; - 66 [label="Function call: R|java/lang/Exception.Exception|()"]; - 67 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 68 [label="Stub" style="filled" fillcolor=gray]; - 69 [label="Exit &&"]; + 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 &&"]; } - 70 [label="Exit when branch condition"]; + 72 [label="Exit when branch condition"]; } - 71 [label="Synthetic else branch"]; - 72 [label="Enter when branch result"]; + 79 [label="Synthetic else branch"]; + 73 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 73 [label="Enter block"]; - 74 [label="Access variable R|/a|"]; - 75 [label="Function call: R|/a|.R|/A.foo|()"]; - 76 [label="Exit block"]; + 74 [label="Enter block"]; + 75 [label="Access variable R|/a|"]; + 76 [label="Function call: R|/a|.R|/A.foo|()"]; + 77 [label="Exit block"]; } - 77 [label="Exit when branch result"]; - 78 [label="Exit when"]; + 78 [label="Exit when branch result"]; + 60 [label="Exit when"]; } - 79 [label="Access variable R|/a|"]; - 80 [label="Function call: R|/a|.R|/A.foo|()"]; - 81 [label="Exit function test_4" style="filled" fillcolor=red]; + 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]; } - - 57 -> {58}; - 58 -> {59}; - 59 -> {60}; - 60 -> {61}; - 61 -> {62}; - 62 -> {63}; + 57 -> {59}; + 59 -> {61}; + 60 -> {80}; + 61 -> {63}; + 62 -> {72}; 63 -> {64}; - 64 -> {69 65}; + 64 -> {65}; 65 -> {66}; 66 -> {67}; - 67 -> {81}; - 67 -> {68} [style=dotted]; - 68 -> {69} [style=dotted]; + 67 -> {62 68}; + 68 -> {69}; 69 -> {70}; - 70 -> {72 71}; - 71 -> {78}; - 72 -> {73}; + 70 -> {58}; + 70 -> {71} [style=dotted]; + 71 -> {62} [style=dotted]; + 72 -> {73 79}; 73 -> {74}; 74 -> {75}; 75 -> {76}; 76 -> {77}; 77 -> {78}; - 78 -> {79}; - 79 -> {80}; + 78 -> {60}; + 79 -> {60}; 80 -> {81}; + 81 -> {58}; subgraph cluster_16 { color=red 82 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_17 { color=blue - 83 [label="Enter ||"]; - 84 [label="Access variable R|/a|"]; - 85 [label="Const: Null(null)"]; - 86 [label="Operator =="]; - 87 [label="Exit left part of ||"]; - 88 [label="Enter right part of ||"]; - 89 [label="Function call: R|java/lang/Exception.Exception|()"]; - 90 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 91 [label="Stub" style="filled" fillcolor=gray]; - 92 [label="Exit ||"]; + 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 ||"]; } - 93 [label="Access variable R|/a|"]; - 94 [label="Function call: R|/a|.#()"]; - 95 [label="Exit function test_5" style="filled" fillcolor=red]; + 94 [label="Access variable R|/a|"]; + 95 [label="Function call: R|/a|.#()"]; + 83 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 82 -> {83}; - 83 -> {84}; - 84 -> {85}; + 82 -> {85}; + 84 -> {94}; 85 -> {86}; 86 -> {87}; - 87 -> {92 88}; + 87 -> {88}; 88 -> {89}; - 89 -> {90}; - 90 -> {95}; - 90 -> {91} [style=dotted]; - 91 -> {92} [style=dotted]; - 92 -> {93}; - 93 -> {94}; + 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 - 97 [label="Enter &&"]; - 98 [label="Access variable R|/a|"]; - 99 [label="Const: Null(null)"]; - 100 [label="Operator !="]; - 101 [label="Exit left part of &&"]; - 102 [label="Enter right part of &&"]; - 103 [label="Function call: R|java/lang/Exception.Exception|()"]; - 104 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 105 [label="Stub" style="filled" fillcolor=gray]; - 106 [label="Exit &&"]; + 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 &&"]; } - 107 [label="Access variable R|/a|"]; - 108 [label="Function call: R|/a|.#()"]; - 109 [label="Exit function teat_6" style="filled" fillcolor=red]; + 108 [label="Access variable R|/a|"]; + 109 [label="Function call: R|/a|.#()"]; + 97 [label="Exit function teat_6" style="filled" fillcolor=red]; } - - 96 -> {97}; - 97 -> {98}; - 98 -> {99}; + 96 -> {99}; + 98 -> {108}; 99 -> {100}; 100 -> {101}; - 101 -> {106 102}; + 101 -> {102}; 102 -> {103}; - 103 -> {104}; - 104 -> {109}; - 104 -> {105} [style=dotted]; - 105 -> {106} [style=dotted]; - 106 -> {107}; - 107 -> {108}; + 103 -> {98 104}; + 104 -> {105}; + 105 -> {106}; + 106 -> {97}; + 106 -> {107} [style=dotted]; + 107 -> {98} [style=dotted]; 108 -> {109}; + 109 -> {97}; subgraph cluster_20 { color=red 110 [label="Enter function test_7" style="filled" fillcolor=red]; subgraph cluster_21 { color=blue - 111 [label="Enter when"]; + 112 [label="Enter when"]; subgraph cluster_22 { color=blue - 112 [label="Enter when branch condition "]; + 114 [label="Enter when branch condition "]; subgraph cluster_23 { color=blue - 113 [label="Enter ||"]; - 114 [label="Access variable R|/a|"]; - 115 [label="Const: Null(null)"]; - 116 [label="Operator =="]; - 117 [label="Exit left part of ||"]; - 118 [label="Enter right part of ||"]; - 119 [label="Function call: R|java/lang/Exception.Exception|()"]; - 120 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 121 [label="Stub" style="filled" fillcolor=gray]; - 122 [label="Exit ||"]; + 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 ||"]; } - 123 [label="Exit when branch condition"]; + 125 [label="Exit when branch condition"]; } - 124 [label="Synthetic else branch"]; - 125 [label="Enter when branch result"]; + 132 [label="Synthetic else branch"]; + 126 [label="Enter when branch result"]; subgraph cluster_24 { color=blue - 126 [label="Enter block"]; - 127 [label="Access variable R|/a|"]; - 128 [label="Function call: R|/a|.#()"]; - 129 [label="Exit block"]; + 127 [label="Enter block"]; + 128 [label="Access variable R|/a|"]; + 129 [label="Function call: R|/a|.#()"]; + 130 [label="Exit block"]; } - 130 [label="Exit when branch result"]; - 131 [label="Exit when"]; + 131 [label="Exit when branch result"]; + 113 [label="Exit when"]; } - 132 [label="Access variable R|/a|"]; - 133 [label="Function call: R|/a|.#()"]; - 134 [label="Exit function test_7" style="filled" fillcolor=red]; + 133 [label="Access variable R|/a|"]; + 134 [label="Function call: R|/a|.#()"]; + 111 [label="Exit function test_7" style="filled" fillcolor=red]; } - - 110 -> {111}; - 111 -> {112}; - 112 -> {113}; - 113 -> {114}; - 114 -> {115}; - 115 -> {116}; + 110 -> {112}; + 112 -> {114}; + 113 -> {133}; + 114 -> {116}; + 115 -> {125}; 116 -> {117}; - 117 -> {122 118}; + 117 -> {118}; 118 -> {119}; 119 -> {120}; - 120 -> {134}; - 120 -> {121} [style=dotted]; - 121 -> {122} [style=dotted]; + 120 -> {115 121}; + 121 -> {122}; 122 -> {123}; - 123 -> {125 124}; - 124 -> {131}; - 125 -> {126}; + 123 -> {111}; + 123 -> {124} [style=dotted]; + 124 -> {115} [style=dotted]; + 125 -> {126 132}; 126 -> {127}; 127 -> {128}; 128 -> {129}; 129 -> {130}; 130 -> {131}; - 131 -> {132}; - 132 -> {133}; + 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 - 136 [label="Enter when"]; + 137 [label="Enter when"]; subgraph cluster_27 { color=blue - 137 [label="Enter when branch condition "]; + 139 [label="Enter when branch condition "]; subgraph cluster_28 { color=blue - 138 [label="Enter &&"]; - 139 [label="Access variable R|/a|"]; - 140 [label="Const: Null(null)"]; - 141 [label="Operator !="]; - 142 [label="Exit left part of &&"]; - 143 [label="Enter right part of &&"]; - 144 [label="Function call: R|java/lang/Exception.Exception|()"]; - 145 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 146 [label="Stub" style="filled" fillcolor=gray]; - 147 [label="Exit &&"]; + 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 &&"]; } - 148 [label="Exit when branch condition"]; + 150 [label="Exit when branch condition"]; } - 149 [label="Synthetic else branch"]; - 150 [label="Enter when branch result"]; + 157 [label="Synthetic else branch"]; + 151 [label="Enter when branch result"]; subgraph cluster_29 { color=blue - 151 [label="Enter block"]; - 152 [label="Access variable R|/a|"]; - 153 [label="Function call: R|/a|.#()"]; - 154 [label="Exit block"]; + 152 [label="Enter block"]; + 153 [label="Access variable R|/a|"]; + 154 [label="Function call: R|/a|.#()"]; + 155 [label="Exit block"]; } - 155 [label="Exit when branch result"]; - 156 [label="Exit when"]; + 156 [label="Exit when branch result"]; + 138 [label="Exit when"]; } - 157 [label="Access variable R|/a|"]; - 158 [label="Function call: R|/a|.#()"]; - 159 [label="Exit function test_8" style="filled" fillcolor=red]; + 158 [label="Access variable R|/a|"]; + 159 [label="Function call: R|/a|.#()"]; + 136 [label="Exit function test_8" style="filled" fillcolor=red]; } - - 135 -> {136}; - 136 -> {137}; - 137 -> {138}; - 138 -> {139}; - 139 -> {140}; - 140 -> {141}; + 135 -> {137}; + 137 -> {139}; + 138 -> {158}; + 139 -> {141}; + 140 -> {150}; 141 -> {142}; - 142 -> {147 143}; + 142 -> {143}; 143 -> {144}; 144 -> {145}; - 145 -> {159}; - 145 -> {146} [style=dotted]; - 146 -> {147} [style=dotted]; + 145 -> {140 146}; + 146 -> {147}; 147 -> {148}; - 148 -> {150 149}; - 149 -> {156}; - 150 -> {151}; + 148 -> {136}; + 148 -> {149} [style=dotted]; + 149 -> {140} [style=dotted]; + 150 -> {151 157}; 151 -> {152}; 152 -> {153}; 153 -> {154}; 154 -> {155}; 155 -> {156}; - 156 -> {157}; - 157 -> {158}; + 156 -> {138}; + 157 -> {138}; 158 -> {159}; + 159 -> {136}; } 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 0f2d880ad42..64ee3364758 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot @@ -8,7 +8,6 @@ digraph boundSmartcasts_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph boundSmartcasts_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph boundSmartcasts_kt { 4 [label="Enter function bar" style="filled" fillcolor=red]; 5 [label="Exit function bar" style="filled" fillcolor=red]; } - 4 -> {5}; subgraph cluster_3 { @@ -32,51 +29,48 @@ digraph boundSmartcasts_kt { 6 [label="Enter class B" style="filled" fillcolor=red]; 7 [label="Exit class B" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function test_1" style="filled" fillcolor=red]; - 9 [label="Access variable R|/x|"]; - 10 [label="Variable declaration: lval y: R|kotlin/Any|"]; + 10 [label="Access variable R|/x|"]; + 11 [label="Variable declaration: lval y: R|kotlin/Any|"]; subgraph cluster_5 { color=blue - 11 [label="Enter when"]; + 12 [label="Enter when"]; 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"]; + 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"]; } - 16 [label="Synthetic else branch"]; - 17 [label="Enter when branch result"]; + 26 [label="Synthetic else branch"]; + 18 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 18 [label="Enter block"]; - 19 [label="Access variable R|/x|"]; - 20 [label="Function call: R|/x|.R|/A.foo|()"]; - 21 [label="Access variable R|/y|"]; - 22 [label="Function call: R|/y|.R|/A.foo|()"]; - 23 [label="Exit block"]; + 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"]; } - 24 [label="Exit when branch result"]; - 25 [label="Exit when"]; + 25 [label="Exit when branch result"]; + 13 [label="Exit when"]; } - 26 [label="Exit function test_1" style="filled" fillcolor=red]; + 9 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; + 8 -> {10}; 10 -> {11}; 11 -> {12}; - 12 -> {13}; - 13 -> {14}; + 12 -> {14}; + 13 -> {9}; 14 -> {15}; - 15 -> {17 16}; - 16 -> {25}; - 17 -> {18}; + 15 -> {16}; + 16 -> {17}; + 17 -> {18 26}; 18 -> {19}; 19 -> {20}; 20 -> {21}; @@ -84,50 +78,49 @@ digraph boundSmartcasts_kt { 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {26}; + 25 -> {13}; + 26 -> {13}; subgraph cluster_8 { color=red 27 [label="Enter function test_2" style="filled" fillcolor=red]; - 28 [label="Access variable R|/x|"]; - 29 [label="Variable declaration: lval y: R|kotlin/Any|"]; + 29 [label="Access variable R|/x|"]; + 30 [label="Variable declaration: lval y: R|kotlin/Any|"]; subgraph cluster_9 { color=blue - 30 [label="Enter when"]; + 31 [label="Enter when"]; subgraph cluster_10 { color=blue - 31 [label="Enter when branch condition "]; - 32 [label="Access variable R|/y|"]; - 33 [label="Type operator: (R|/y| is R|A|)"]; - 34 [label="Exit when branch condition"]; + 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"]; } - 35 [label="Synthetic else branch"]; - 36 [label="Enter when branch result"]; + 45 [label="Synthetic else branch"]; + 37 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 37 [label="Enter block"]; - 38 [label="Access variable R|/x|"]; - 39 [label="Function call: R|/x|.R|/A.foo|()"]; - 40 [label="Access variable R|/y|"]; - 41 [label="Function call: R|/y|.R|/A.foo|()"]; - 42 [label="Exit block"]; + 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"]; } - 43 [label="Exit when branch result"]; - 44 [label="Exit when"]; + 44 [label="Exit when branch result"]; + 32 [label="Exit when"]; } - 45 [label="Exit function test_2" style="filled" fillcolor=red]; + 28 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 27 -> {28}; - 28 -> {29}; + 27 -> {29}; 29 -> {30}; 30 -> {31}; - 31 -> {32}; - 32 -> {33}; + 31 -> {33}; + 32 -> {28}; 33 -> {34}; - 34 -> {36 35}; - 35 -> {44}; - 36 -> {37}; + 34 -> {35}; + 35 -> {36}; + 36 -> {37 45}; 37 -> {38}; 38 -> {39}; 39 -> {40}; @@ -135,89 +128,88 @@ digraph boundSmartcasts_kt { 41 -> {42}; 42 -> {43}; 43 -> {44}; - 44 -> {45}; + 44 -> {32}; + 45 -> {32}; subgraph cluster_12 { color=red 46 [label="Enter function test_3" style="filled" fillcolor=red]; - 47 [label="Access variable R|/x|"]; - 48 [label="Variable declaration: lvar z: R|kotlin/Any|"]; + 48 [label="Access variable R|/x|"]; + 49 [label="Variable declaration: lvar z: R|kotlin/Any|"]; subgraph cluster_13 { color=blue - 49 [label="Enter when"]; + 50 [label="Enter when"]; subgraph cluster_14 { color=blue - 50 [label="Enter when branch condition "]; - 51 [label="Access variable R|/x|"]; - 52 [label="Type operator: (R|/x| is R|A|)"]; - 53 [label="Exit when branch condition"]; + 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"]; } - 54 [label="Synthetic else branch"]; - 55 [label="Enter when branch result"]; + 62 [label="Synthetic else branch"]; + 56 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 56 [label="Enter block"]; - 57 [label="Access variable R|/z|"]; - 58 [label="Function call: R|/z|.R|/A.foo|()"]; - 59 [label="Exit block"]; + 57 [label="Enter block"]; + 58 [label="Access variable R|/z|"]; + 59 [label="Function call: R|/z|.R|/A.foo|()"]; + 60 [label="Exit block"]; } - 60 [label="Exit when branch result"]; - 61 [label="Exit when"]; + 61 [label="Exit when branch result"]; + 51 [label="Exit when"]; } - 62 [label="Access variable R|/y|"]; - 63 [label="Assignmenet: R|/z|"]; + 63 [label="Access variable R|/y|"]; + 64 [label="Assignment: R|/z|"]; subgraph cluster_16 { color=blue - 64 [label="Enter when"]; + 65 [label="Enter when"]; subgraph cluster_17 { color=blue - 65 [label="Enter when branch condition "]; - 66 [label="Access variable R|/y|"]; - 67 [label="Type operator: (R|/y| is R|B|)"]; - 68 [label="Exit when branch condition"]; + 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"]; } - 69 [label="Synthetic else branch"]; - 70 [label="Enter when branch result"]; + 79 [label="Synthetic else branch"]; + 71 [label="Enter when branch result"]; subgraph cluster_18 { color=blue - 71 [label="Enter block"]; - 72 [label="Access variable R|/z|"]; - 73 [label="Function call: R|/z|.#()"]; - 74 [label="Access variable R|/z|"]; - 75 [label="Function call: R|/z|.R|/B.bar|()"]; - 76 [label="Exit block"]; + 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"]; } - 77 [label="Exit when branch result"]; - 78 [label="Exit when"]; + 78 [label="Exit when branch result"]; + 66 [label="Exit when"]; } - 79 [label="Exit function test_3" style="filled" fillcolor=red]; + 47 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 46 -> {47}; - 47 -> {48}; + 46 -> {48}; 48 -> {49}; 49 -> {50}; - 50 -> {51}; - 51 -> {52}; + 50 -> {52}; + 51 -> {63}; 52 -> {53}; - 53 -> {55 54}; - 54 -> {61}; - 55 -> {56}; + 53 -> {54}; + 54 -> {55}; + 55 -> {56 62}; 56 -> {57}; 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; - 61 -> {62}; - 62 -> {63}; + 61 -> {51}; + 62 -> {51}; 63 -> {64}; 64 -> {65}; - 65 -> {66}; - 66 -> {67}; + 65 -> {67}; + 66 -> {47}; 67 -> {68}; - 68 -> {70 69}; - 69 -> {78}; - 70 -> {71}; + 68 -> {69}; + 69 -> {70}; + 70 -> {71 79}; 71 -> {72}; 72 -> {73}; 73 -> {74}; @@ -225,50 +217,49 @@ digraph boundSmartcasts_kt { 75 -> {76}; 76 -> {77}; 77 -> {78}; - 78 -> {79}; + 78 -> {66}; + 79 -> {66}; subgraph cluster_19 { color=red 80 [label="Enter function test_4" style="filled" fillcolor=red]; - 81 [label="Const: Int(1)"]; - 82 [label="Variable declaration: lvar x: R|kotlin/Any|"]; - 83 [label="Access variable R|/x|"]; - 84 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 85 [label="Access variable R|/x|"]; - 86 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 87 [label="Access variable R|/y|"]; - 88 [label="Assignmenet: R|/x|"]; - 89 [label="Access variable R|/x|"]; - 90 [label="Function call: R|/x|.#()"]; + 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 - 91 [label="Enter when"]; + 92 [label="Enter when"]; subgraph cluster_21 { color=blue - 92 [label="Enter when branch condition "]; - 93 [label="Access variable R|/y|"]; - 94 [label="Type operator: (R|/y| is R|A|)"]; - 95 [label="Exit when branch condition"]; + 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"]; } - 96 [label="Synthetic else branch"]; - 97 [label="Enter when branch result"]; + 106 [label="Synthetic else branch"]; + 98 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 98 [label="Enter block"]; - 99 [label="Access variable R|/x|"]; - 100 [label="Function call: R|/x|.R|/A.foo|()"]; - 101 [label="Access variable R|/y|"]; - 102 [label="Function call: R|/y|.R|/A.foo|()"]; - 103 [label="Exit block"]; + 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"]; } - 104 [label="Exit when branch result"]; - 105 [label="Exit when"]; + 105 [label="Exit when branch result"]; + 93 [label="Exit when"]; } - 106 [label="Exit function test_4" style="filled" fillcolor=red]; + 81 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 80 -> {81}; - 81 -> {82}; + 80 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; @@ -279,12 +270,12 @@ digraph boundSmartcasts_kt { 89 -> {90}; 90 -> {91}; 91 -> {92}; - 92 -> {93}; - 93 -> {94}; + 92 -> {94}; + 93 -> {81}; 94 -> {95}; - 95 -> {97 96}; - 96 -> {105}; - 97 -> {98}; + 95 -> {96}; + 96 -> {97}; + 97 -> {98 106}; 98 -> {99}; 99 -> {100}; 100 -> {101}; @@ -292,49 +283,46 @@ digraph boundSmartcasts_kt { 102 -> {103}; 103 -> {104}; 104 -> {105}; - 105 -> {106}; + 105 -> {93}; + 106 -> {93}; subgraph cluster_23 { color=red 107 [label="Enter function " style="filled" fillcolor=red]; - 108 [label="Delegated constructor call: super()"]; - 109 [label="Exit function " style="filled" fillcolor=red]; + 109 [label="Delegated constructor call: super()"]; + 108 [label="Exit function " style="filled" fillcolor=red]; } - - 107 -> {108}; - 108 -> {109}; + 107 -> {109}; + 109 -> {108}; subgraph cluster_24 { color=red 110 [label="Enter function getter" style="filled" fillcolor=red]; 111 [label="Exit function getter" style="filled" fillcolor=red]; } - 110 -> {111}; subgraph cluster_25 { - color=red - 112 [label="Enter property" style="filled" fillcolor=red]; - 113 [label="Access variable R|/any|"]; - 114 [label="Exit property" style="filled" fillcolor=red]; - } - - 112 -> {113}; - 113 -> {114}; - - subgraph cluster_26 { color=red 115 [label="Enter class D" 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}; subgraph cluster_27 { color=red 117 [label="Enter function baz" style="filled" fillcolor=red]; 118 [label="Exit function baz" style="filled" fillcolor=red]; } - 117 -> {118}; subgraph cluster_28 { @@ -342,79 +330,77 @@ digraph boundSmartcasts_kt { 119 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_29 { color=blue - 120 [label="Enter when"]; - 121 [label="Access variable R|/d|"]; - 122 [label="Access variable R|/D.any|"]; - 123 [label="Variable declaration: lval : R|kotlin/Any?|"]; + 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 - 124 [label="Enter when branch condition "]; - 125 [label="Const: Null(null)"]; - 126 [label="Operator =="]; - 127 [label="Exit when branch condition"]; + 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 - 128 [label="Enter when branch condition else"]; - 129 [label="Exit when branch condition"]; + 136 [label="Enter when branch condition else"]; + 137 [label="Exit when branch condition"]; } - 130 [label="Enter when branch result"]; + 138 [label="Enter when branch result"]; subgraph cluster_32 { color=blue - 131 [label="Enter block"]; - 132 [label="Access variable R|/|"]; - 133 [label="Exit block"]; + 139 [label="Enter block"]; + 140 [label="Access variable R|/|"]; + 141 [label="Exit block"]; } - 134 [label="Exit when branch result"]; - 135 [label="Enter when branch result"]; + 142 [label="Exit when branch result"]; + 130 [label="Enter when branch result"]; subgraph cluster_33 { color=blue - 136 [label="Enter block"]; - 137 [label="Jump: ^test_5 Unit"]; - 138 [label="Stub" style="filled" fillcolor=gray]; - 139 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 140 [label="Exit when branch result" style="filled" fillcolor=gray]; - 141 [label="Exit when"]; + 135 [label="Exit when branch result" style="filled" fillcolor=gray]; + 122 [label="Exit when"]; } - 142 [label="Variable declaration: lval a: R|kotlin/Any|"]; - 143 [label="Access variable R|/a|"]; - 144 [label="Function call: R|/a|.R|/baz|()"]; - 145 [label="Access variable R|/d|"]; - 146 [label="Access variable R|/D.any|"]; - 147 [label="Function call: R|/d|.R|/D.any|.R|/baz|()"]; - 148 [label="Access variable R|/a|"]; - 149 [label="Type operator: (R|/a| as R|A|)"]; - 150 [label="Access variable R|/a|"]; - 151 [label="Function call: R|/a|.R|/A.foo|()"]; - 152 [label="Exit function test_5" style="filled" fillcolor=red]; + 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]; } - - 119 -> {120}; - 120 -> {121}; - 121 -> {122}; - 122 -> {123}; + 119 -> {121}; + 121 -> {123}; + 122 -> {143}; 123 -> {124}; 124 -> {125}; 125 -> {126}; 126 -> {127}; - 127 -> {135 128}; + 127 -> {128}; 128 -> {129}; - 129 -> {130}; + 129 -> {130 136}; 130 -> {131}; 131 -> {132}; - 132 -> {133}; - 133 -> {134}; - 134 -> {141}; - 135 -> {136}; + 132 -> {120}; + 132 -> {133} [style=dotted]; + 133 -> {134} [style=dotted]; + 134 -> {135} [style=dotted]; + 135 -> {122} [style=dotted]; 136 -> {137}; - 137 -> {152}; - 137 -> {138} [style=dotted]; - 138 -> {139} [style=dotted]; - 139 -> {140} [style=dotted]; - 140 -> {141} [style=dotted]; + 137 -> {138}; + 138 -> {139}; + 139 -> {140}; + 140 -> {141}; 141 -> {142}; - 142 -> {143}; + 142 -> {122}; 143 -> {144}; 144 -> {145}; 145 -> {146}; @@ -424,28 +410,27 @@ digraph boundSmartcasts_kt { 149 -> {150}; 150 -> {151}; 151 -> {152}; + 152 -> {120}; subgraph cluster_34 { color=red 153 [label="Enter function test_6" style="filled" fillcolor=red]; - 154 [label="Access variable R|/d1|"]; - 155 [label="Access variable R|/D.any|"]; - 156 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 157 [label="Access variable R|/a|"]; - 158 [label="Type operator: (R|/a| as R|A|)"]; - 159 [label="Access variable R|/a|"]; - 160 [label="Function call: R|/a|.R|/A.foo|()"]; - 161 [label="Access variable R|/d1|"]; - 162 [label="Access variable R|/D.any|"]; - 163 [label="Function call: R|/d1|.R|/D.any|.R|/A.foo|()"]; - 164 [label="Access variable R|/d1|"]; - 165 [label="Access variable R|/D.any|"]; - 166 [label="Function call: R|/d1|.R|/D.any|.R|/baz|()"]; - 167 [label="Exit 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 -> {154}; - 154 -> {155}; + 153 -> {155}; 155 -> {156}; 156 -> {157}; 157 -> {158}; @@ -458,42 +443,41 @@ digraph boundSmartcasts_kt { 164 -> {165}; 165 -> {166}; 166 -> {167}; + 167 -> {154}; subgraph cluster_35 { color=red 168 [label="Enter function test_7" style="filled" fillcolor=red]; - 169 [label="Access variable R|/d1|"]; - 170 [label="Enter safe call"]; - 171 [label="Access variable R|/D.any|"]; + 170 [label="Access variable R|/d1|"]; + 171 [label="Enter safe call"]; + 173 [label="Access variable R|/D.any|"]; 172 [label="Exit safe call"]; - 173 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 174 [label="Access variable R|/d2|"]; - 175 [label="Enter safe call"]; - 176 [label="Access variable R|/D.any|"]; + 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"]; - 178 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - 179 [label="Access variable R|/a|"]; - 180 [label="Type operator: (R|/a| as R|A|)"]; - 181 [label="Access variable R|/a|"]; - 182 [label="Function call: R|/a|.R|/A.foo|()"]; - 183 [label="Access variable R|/b|"]; - 184 [label="Type operator: (R|/b| as R|B|)"]; - 185 [label="Access variable R|/b|"]; - 186 [label="Function call: R|/b|.R|/B.bar|()"]; - 187 [label="Exit function test_7" style="filled" fillcolor=red]; + 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]; } - - 168 -> {169}; - 169 -> {170 172}; - 170 -> {171}; - 171 -> {172}; - 172 -> {173}; - 173 -> {174}; - 174 -> {175 177}; - 175 -> {176}; - 176 -> {177}; - 177 -> {178}; - 178 -> {179}; + 168 -> {170}; + 170 -> {171 172}; + 171 -> {173}; + 172 -> {174}; + 173 -> {172}; + 174 -> {175}; + 175 -> {176 177}; + 176 -> {178}; + 177 -> {179}; + 178 -> {177}; 179 -> {180}; 180 -> {181}; 181 -> {182}; @@ -502,5 +486,6 @@ digraph boundSmartcasts_kt { 184 -> {185}; 185 -> {186}; 186 -> {187}; + 187 -> {169}; } 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 c185b2e3364..3e652ee2698 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot @@ -6,197 +6,191 @@ digraph boundSmartcastsInBranches_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=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 - 5 [label="Enter property" style="filled" fillcolor=red]; - 6 [label="Const: String()"]; - 7 [label="Exit property" style="filled" fillcolor=red]; - } - - 5 -> {6}; - 6 -> {7}; - - subgraph cluster_3 { color=red 8 [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 -> {5} [color=green]; + 5 -> {7}; + 6 -> {9} [color=green]; + 7 -> {6}; subgraph cluster_4 { color=red 10 [label="Enter function test_0" style="filled" fillcolor=red]; - 11 [label="Const: Null(null)"]; - 12 [label="Variable declaration: lvar goodA: R|A?|"]; - 13 [label="Access variable R|/list|"]; - 14 [label="Function call: R|/list|.R|FakeOverride|>|()"]; - 15 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + 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 - 16 [label="Enter while loop"]; + 17 [label="Enter while loop"]; subgraph cluster_6 { color=blue - 17 [label="Enter loop condition"]; - 18 [label="Access variable R|/|"]; - 19 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 20 [label="Exit loop condition"]; + 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 - 21 [label="Enter loop block"]; + 23 [label="Enter loop block"]; subgraph cluster_8 { color=blue - 22 [label="Enter block"]; - 23 [label="Access variable R|/|"]; - 24 [label="Function call: R|/|.R|FakeOverride|()"]; - 25 [label="Variable declaration: lval a: R|A|"]; + 24 [label="Enter block"]; + 25 [label="Access variable R|/|"]; + 26 [label="Function call: R|/|.R|FakeOverride|()"]; + 27 [label="Variable declaration: lval a: R|A|"]; subgraph cluster_9 { color=blue - 26 [label="Enter when"]; + 28 [label="Enter when"]; subgraph cluster_10 { color=blue - 27 [label="Enter when branch condition "]; - 28 [label="Access variable R|/goodA|"]; - 29 [label="Const: Null(null)"]; - 30 [label="Operator =="]; - 31 [label="Exit when branch condition"]; + 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"]; } - 32 [label="Synthetic else branch"]; - 33 [label="Enter when branch result"]; + 43 [label="Synthetic else branch"]; + 35 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 34 [label="Enter block"]; - 35 [label="Access variable R|/a|"]; - 36 [label="Assignmenet: R|/goodA|"]; - 37 [label="Jump: continue@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] "]; - 38 [label="Stub" style="filled" fillcolor=gray]; - 39 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 40 [label="Exit when branch result" style="filled" fillcolor=gray]; - 41 [label="Exit when"]; + 42 [label="Exit when branch result" style="filled" fillcolor=gray]; + 29 [label="Exit when"]; } - 42 [label="Access variable R|/goodA|"]; - 43 [label="Access variable R|/A.s|"]; - 44 [label="Exit block"]; + 44 [label="Access variable R|/goodA|"]; + 45 [label="Access variable R|/A.s|"]; + 46 [label="Exit block"]; } - 45 [label="Exit loop block"]; + 47 [label="Exit loop block"]; } - 46 [label="Exit whileloop"]; + 18 [label="Exit whileloop"]; } - 47 [label="Exit function test_0" style="filled" fillcolor=red]; + 11 [label="Exit function test_0" style="filled" fillcolor=red]; } - - 10 -> {11}; - 11 -> {12}; + 10 -> {12}; 12 -> {13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {18}; - 18 -> {19}; + 17 -> {19}; + 18 -> {11}; 19 -> {20}; - 20 -> {46 21}; + 20 -> {21}; 21 -> {22}; - 22 -> {23}; + 22 -> {18 23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {29}; - 29 -> {30}; + 28 -> {30}; + 29 -> {44}; 30 -> {31}; - 31 -> {33 32}; - 32 -> {41}; + 31 -> {32}; + 32 -> {33}; 33 -> {34}; - 34 -> {35}; + 34 -> {35 43}; 35 -> {36}; 36 -> {37}; - 37 -> {16}; - 37 -> {38} [style=dotted]; - 38 -> {39} [style=dotted]; + 37 -> {38}; + 38 -> {39}; + 39 -> {17}; 39 -> {40} [style=dotted]; 40 -> {41} [style=dotted]; - 41 -> {42}; - 42 -> {43}; - 43 -> {44}; + 41 -> {42} [style=dotted]; + 42 -> {29} [style=dotted]; + 43 -> {29}; 44 -> {45}; - 45 -> {17}; + 45 -> {46}; 46 -> {47}; + 47 -> {19}; subgraph cluster_12 { color=red 48 [label="Enter function test_1" style="filled" fillcolor=red]; - 49 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 50 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_13 { color=blue - 50 [label="Enter when"]; + 51 [label="Enter when"]; subgraph cluster_14 { color=blue - 51 [label="Enter when branch condition "]; - 52 [label="Access variable R|/b|"]; - 53 [label="Exit when branch condition"]; + 53 [label="Enter when branch condition "]; + 54 [label="Access variable R|/b|"]; + 55 [label="Exit when branch condition"]; } subgraph cluster_15 { color=blue - 54 [label="Enter when branch condition else"]; - 55 [label="Exit when branch condition"]; + 62 [label="Enter when branch condition else"]; + 63 [label="Exit when branch condition"]; } - 56 [label="Enter when branch result"]; + 64 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 57 [label="Enter block"]; - 58 [label="Access variable R|/a|"]; - 59 [label="Assignmenet: R|/x|"]; - 60 [label="Exit block"]; + 65 [label="Enter block"]; + 66 [label="Access variable R|/a|"]; + 67 [label="Assignment: R|/x|"]; + 68 [label="Exit block"]; } - 61 [label="Exit when branch result"]; - 62 [label="Enter when branch result"]; + 69 [label="Exit when branch result"]; + 56 [label="Enter when branch result"]; subgraph cluster_17 { color=blue - 63 [label="Enter block"]; - 64 [label="Function call: R|/A.A|()"]; - 65 [label="Assignmenet: R|/x|"]; - 66 [label="Exit block"]; + 57 [label="Enter block"]; + 58 [label="Function call: R|/A.A|()"]; + 59 [label="Assignment: R|/x|"]; + 60 [label="Exit block"]; } - 67 [label="Exit when branch result"]; - 68 [label="Exit when"]; + 61 [label="Exit when branch result"]; + 52 [label="Exit when"]; } - 69 [label="Access variable R|/x|"]; - 70 [label="Access variable R|/A.s|"]; - 71 [label="Exit function test_1" style="filled" fillcolor=red]; + 70 [label="Access variable R|/x|"]; + 71 [label="Access variable R|/A.s|"]; + 49 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 48 -> {49}; - 49 -> {50}; + 48 -> {50}; 50 -> {51}; - 51 -> {52}; - 52 -> {53}; - 53 -> {62 54}; + 51 -> {53}; + 52 -> {70}; + 53 -> {54}; 54 -> {55}; - 55 -> {56}; + 55 -> {56 62}; 56 -> {57}; 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; - 61 -> {68}; + 61 -> {52}; 62 -> {63}; 63 -> {64}; 64 -> {65}; @@ -204,70 +198,69 @@ digraph boundSmartcastsInBranches_kt { 66 -> {67}; 67 -> {68}; 68 -> {69}; - 69 -> {70}; + 69 -> {52}; 70 -> {71}; + 71 -> {49}; subgraph cluster_18 { color=red 72 [label="Enter function test_2" style="filled" fillcolor=red]; - 73 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 74 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_19 { color=blue - 74 [label="Enter when"]; + 75 [label="Enter when"]; subgraph cluster_20 { color=blue - 75 [label="Enter when branch condition "]; - 76 [label="Access variable R|/b|"]; - 77 [label="Exit when branch condition"]; + 77 [label="Enter when branch condition "]; + 78 [label="Access variable R|/b|"]; + 79 [label="Exit when branch condition"]; } subgraph cluster_21 { color=blue - 78 [label="Enter when branch condition else"]; - 79 [label="Exit when branch condition"]; + 86 [label="Enter when branch condition else"]; + 87 [label="Exit when branch condition"]; } - 80 [label="Enter when branch result"]; + 88 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 81 [label="Enter block"]; - 82 [label="Access variable R|/a|"]; - 83 [label="Assignmenet: R|/x|"]; - 84 [label="Access variable R|/a|"]; - 85 [label="Type operator: (R|/a| as R|A|)"]; - 86 [label="Exit block"]; + 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"]; } - 87 [label="Exit when branch result"]; - 88 [label="Enter when branch result"]; + 95 [label="Exit when branch result"]; + 80 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 89 [label="Enter block"]; - 90 [label="Function call: R|/A.A|()"]; - 91 [label="Assignmenet: R|/x|"]; - 92 [label="Exit block"]; + 81 [label="Enter block"]; + 82 [label="Function call: R|/A.A|()"]; + 83 [label="Assignment: R|/x|"]; + 84 [label="Exit block"]; } - 93 [label="Exit when branch result"]; - 94 [label="Exit when"]; + 85 [label="Exit when branch result"]; + 76 [label="Exit when"]; } - 95 [label="Access variable R|/x|"]; - 96 [label="Access variable R|/A.s|"]; - 97 [label="Exit function test_2" style="filled" fillcolor=red]; + 96 [label="Access variable R|/x|"]; + 97 [label="Access variable R|/A.s|"]; + 73 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 72 -> {73}; - 73 -> {74}; + 72 -> {74}; 74 -> {75}; - 75 -> {76}; - 76 -> {77}; - 77 -> {88 78}; + 75 -> {77}; + 76 -> {96}; + 77 -> {78}; 78 -> {79}; - 79 -> {80}; + 79 -> {80 86}; 80 -> {81}; 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {86}; + 85 -> {76}; 86 -> {87}; - 87 -> {94}; + 87 -> {88}; 88 -> {89}; 89 -> {90}; 90 -> {91}; @@ -275,70 +268,69 @@ digraph boundSmartcastsInBranches_kt { 92 -> {93}; 93 -> {94}; 94 -> {95}; - 95 -> {96}; + 95 -> {76}; 96 -> {97}; + 97 -> {73}; subgraph cluster_24 { color=red 98 [label="Enter function test_3" style="filled" fillcolor=red]; - 99 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 100 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_25 { color=blue - 100 [label="Enter when"]; + 101 [label="Enter when"]; subgraph cluster_26 { color=blue - 101 [label="Enter when branch condition "]; - 102 [label="Access variable R|/b|"]; - 103 [label="Exit when branch condition"]; + 103 [label="Enter when branch condition "]; + 104 [label="Access variable R|/b|"]; + 105 [label="Exit when branch condition"]; } subgraph cluster_27 { color=blue - 104 [label="Enter when branch condition else"]; - 105 [label="Exit when branch condition"]; + 112 [label="Enter when branch condition else"]; + 113 [label="Exit when branch condition"]; } - 106 [label="Enter when branch result"]; + 114 [label="Enter when branch result"]; subgraph cluster_28 { color=blue - 107 [label="Enter block"]; - 108 [label="Access variable R|/a|"]; - 109 [label="Type operator: (R|/a| as R|A|)"]; - 110 [label="Access variable R|/a|"]; - 111 [label="Assignmenet: R|/x|"]; - 112 [label="Exit block"]; + 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"]; } - 113 [label="Exit when branch result"]; - 114 [label="Enter when branch result"]; + 121 [label="Exit when branch result"]; + 106 [label="Enter when branch result"]; subgraph cluster_29 { color=blue - 115 [label="Enter block"]; - 116 [label="Function call: R|/A.A|()"]; - 117 [label="Assignmenet: R|/x|"]; - 118 [label="Exit block"]; + 107 [label="Enter block"]; + 108 [label="Function call: R|/A.A|()"]; + 109 [label="Assignment: R|/x|"]; + 110 [label="Exit block"]; } - 119 [label="Exit when branch result"]; - 120 [label="Exit when"]; + 111 [label="Exit when branch result"]; + 102 [label="Exit when"]; } - 121 [label="Access variable R|/x|"]; - 122 [label="Access variable R|/A.s|"]; - 123 [label="Exit function test_3" style="filled" fillcolor=red]; + 122 [label="Access variable R|/x|"]; + 123 [label="Access variable R|/A.s|"]; + 99 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 98 -> {99}; - 99 -> {100}; + 98 -> {100}; 100 -> {101}; - 101 -> {102}; - 102 -> {103}; - 103 -> {114 104}; + 101 -> {103}; + 102 -> {122}; + 103 -> {104}; 104 -> {105}; - 105 -> {106}; + 105 -> {106 112}; 106 -> {107}; 107 -> {108}; 108 -> {109}; 109 -> {110}; 110 -> {111}; - 111 -> {112}; + 111 -> {102}; 112 -> {113}; - 113 -> {120}; + 113 -> {114}; 114 -> {115}; 115 -> {116}; 116 -> {117}; @@ -346,70 +338,69 @@ digraph boundSmartcastsInBranches_kt { 118 -> {119}; 119 -> {120}; 120 -> {121}; - 121 -> {122}; + 121 -> {102}; 122 -> {123}; + 123 -> {99}; subgraph cluster_30 { color=red 124 [label="Enter function test_4" style="filled" fillcolor=red]; - 125 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 126 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_31 { color=blue - 126 [label="Enter when"]; + 127 [label="Enter when"]; subgraph cluster_32 { color=blue - 127 [label="Enter when branch condition "]; - 128 [label="Access variable R|/b|"]; - 129 [label="Exit when branch condition"]; + 129 [label="Enter when branch condition "]; + 130 [label="Access variable R|/b|"]; + 131 [label="Exit when branch condition"]; } subgraph cluster_33 { color=blue - 130 [label="Enter when branch condition else"]; - 131 [label="Exit when branch condition"]; + 138 [label="Enter when branch condition else"]; + 139 [label="Exit when branch condition"]; } - 132 [label="Enter when branch result"]; + 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="Assignmenet: R|/x|"]; + 135 [label="Assignment: R|/x|"]; 136 [label="Exit block"]; } 137 [label="Exit when branch result"]; - 138 [label="Enter when branch result"]; - subgraph cluster_35 { - color=blue - 139 [label="Enter block"]; - 140 [label="Access variable R|/a|"]; - 141 [label="Assignmenet: R|/x|"]; - 142 [label="Exit block"]; - } - 143 [label="Exit when branch result"]; - 144 [label="Exit when"]; + 128 [label="Exit when"]; } - 145 [label="Access variable R|/x|"]; - 146 [label="Type operator: (R|/x| as R|A|)"]; - 147 [label="Access variable R|/x|"]; - 148 [label="Access variable R|/A.s|"]; - 149 [label="Access variable R|/a|"]; - 150 [label="Access variable R|/A.s|"]; - 151 [label="Exit function test_4" style="filled" fillcolor=red]; + 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 -> {125}; - 125 -> {126}; + 124 -> {126}; 126 -> {127}; - 127 -> {128}; - 128 -> {129}; - 129 -> {138 130}; + 127 -> {129}; + 128 -> {146}; + 129 -> {130}; 130 -> {131}; - 131 -> {132}; + 131 -> {132 138}; 132 -> {133}; 133 -> {134}; 134 -> {135}; 135 -> {136}; 136 -> {137}; - 137 -> {144}; + 137 -> {128}; 138 -> {139}; 139 -> {140}; 140 -> {141}; @@ -417,74 +408,73 @@ digraph boundSmartcastsInBranches_kt { 142 -> {143}; 143 -> {144}; 144 -> {145}; - 145 -> {146}; + 145 -> {128}; 146 -> {147}; 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]; - 153 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 154 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_37 { color=blue - 154 [label="Enter when"]; + 155 [label="Enter when"]; subgraph cluster_38 { color=blue - 155 [label="Enter when branch condition "]; - 156 [label="Access variable R|/b|"]; - 157 [label="Exit when branch condition"]; + 157 [label="Enter when branch condition "]; + 158 [label="Access variable R|/b|"]; + 159 [label="Exit when branch condition"]; } subgraph cluster_39 { color=blue - 158 [label="Enter when branch condition else"]; - 159 [label="Exit when branch condition"]; + 166 [label="Enter when branch condition else"]; + 167 [label="Exit when branch condition"]; } - 160 [label="Enter when branch result"]; + 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="Assignmenet: R|/x|"]; + 163 [label="Assignment: R|/x|"]; 164 [label="Exit block"]; } 165 [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|/a|"]; - 169 [label="Assignmenet: R|/x|"]; - 170 [label="Exit block"]; - } - 171 [label="Exit when branch result"]; - 172 [label="Exit when"]; + 156 [label="Exit when"]; } - 173 [label="Access variable R|/a|"]; - 174 [label="Type operator: (R|/a| as R|A|)"]; - 175 [label="Access variable R|/x|"]; - 176 [label="Access variable R|/A.s|"]; - 177 [label="Access variable R|/a|"]; - 178 [label="Access variable R|/A.s|"]; - 179 [label="Exit function test_5" style="filled" fillcolor=red]; + 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 -> {153}; - 153 -> {154}; + 152 -> {154}; 154 -> {155}; - 155 -> {156}; - 156 -> {157}; - 157 -> {166 158}; + 155 -> {157}; + 156 -> {174}; + 157 -> {158}; 158 -> {159}; - 159 -> {160}; + 159 -> {160 166}; 160 -> {161}; 161 -> {162}; 162 -> {163}; 163 -> {164}; 164 -> {165}; - 165 -> {172}; + 165 -> {156}; 166 -> {167}; 167 -> {168}; 168 -> {169}; @@ -492,222 +482,220 @@ digraph boundSmartcastsInBranches_kt { 170 -> {171}; 171 -> {172}; 172 -> {173}; - 173 -> {174}; + 173 -> {156}; 174 -> {175}; 175 -> {176}; 176 -> {177}; 177 -> {178}; 178 -> {179}; + 179 -> {153}; subgraph cluster_42 { color=red 180 [label="Enter function test_6" style="filled" fillcolor=red]; - 181 [label="Variable declaration: lval x: R|kotlin/Any|"]; - 182 [label="Access variable R|/a|"]; - 183 [label="Assignmenet: R|/x|"]; - 184 [label="Access variable R|/x|"]; - 185 [label="Access variable R|/A.s|"]; - 186 [label="Exit 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 -> {181}; - 181 -> {182}; + 180 -> {182}; 182 -> {183}; 183 -> {184}; 184 -> {185}; 185 -> {186}; + 186 -> {181}; subgraph cluster_43 { color=red 187 [label="Enter function test_7" style="filled" fillcolor=red]; - 188 [label="Const: Null(null)"]; - 189 [label="Variable declaration: lval z: R|kotlin/String?|"]; - 190 [label="Access variable R|/z|"]; - 191 [label="Variable declaration: lvar y: R|kotlin/String?|"]; - 192 [label="Access variable R|/y|"]; - 193 [label="Variable declaration: lval x: R|kotlin/String?|"]; + 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 - 194 [label="Enter when"]; + 195 [label="Enter when"]; subgraph cluster_45 { color=blue - 195 [label="Enter when branch condition "]; - 196 [label="Access variable R|/x|"]; - 197 [label="Const: Null(null)"]; - 198 [label="Operator !="]; - 199 [label="Exit when branch condition"]; + 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"]; } - 200 [label="Synthetic else branch"]; - 201 [label="Enter when branch result"]; + 212 [label="Synthetic else branch"]; + 202 [label="Enter when branch result"]; subgraph cluster_46 { color=blue - 202 [label="Enter block"]; - 203 [label="Access variable R|/x|"]; - 204 [label="Access variable R|kotlin/String.length|"]; - 205 [label="Access variable R|/y|"]; - 206 [label="Access variable R|kotlin/String.length|"]; - 207 [label="Access variable R|/z|"]; - 208 [label="Access variable R|kotlin/String.length|"]; - 209 [label="Exit block"]; - } - 210 [label="Exit when branch result"]; - 211 [label="Exit when"]; + 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 - 212 [label="Enter when"]; + 213 [label="Enter when"]; subgraph cluster_48 { color=blue - 213 [label="Enter when branch condition "]; - 214 [label="Access variable R|/y|"]; - 215 [label="Const: Null(null)"]; - 216 [label="Operator !="]; - 217 [label="Exit when branch condition"]; + 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"]; } - 218 [label="Synthetic else branch"]; - 219 [label="Enter when branch result"]; + 230 [label="Synthetic else branch"]; + 220 [label="Enter when branch result"]; subgraph cluster_49 { color=blue - 220 [label="Enter block"]; - 221 [label="Access variable R|/x|"]; - 222 [label="Access variable R|kotlin/String.length|"]; - 223 [label="Access variable R|/y|"]; - 224 [label="Access variable R|kotlin/String.length|"]; - 225 [label="Access variable R|/z|"]; - 226 [label="Access variable R|kotlin/String.length|"]; - 227 [label="Exit block"]; - } - 228 [label="Exit when branch result"]; - 229 [label="Exit when"]; + 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 - 230 [label="Enter when"]; + 231 [label="Enter when"]; subgraph cluster_51 { color=blue - 231 [label="Enter when branch condition "]; - 232 [label="Access variable R|/z|"]; - 233 [label="Const: Null(null)"]; - 234 [label="Operator !="]; - 235 [label="Exit when branch condition"]; + 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"]; } - 236 [label="Synthetic else branch"]; - 237 [label="Enter when branch result"]; + 248 [label="Synthetic else branch"]; + 238 [label="Enter when branch result"]; subgraph cluster_52 { color=blue - 238 [label="Enter block"]; - 239 [label="Access variable R|/x|"]; - 240 [label="Access variable R|kotlin/String.length|"]; - 241 [label="Access variable R|/y|"]; - 242 [label="Access variable R|kotlin/String.length|"]; - 243 [label="Access variable R|/z|"]; - 244 [label="Access variable R|kotlin/String.length|"]; - 245 [label="Exit block"]; - } - 246 [label="Exit when branch result"]; - 247 [label="Exit when"]; + 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"]; } - 248 [label="Const: Null(null)"]; - 249 [label="Assignmenet: R|/y|"]; + 249 [label="Const: Null(null)"]; + 250 [label="Assignment: R|/y|"]; subgraph cluster_53 { color=blue - 250 [label="Enter when"]; + 251 [label="Enter when"]; subgraph cluster_54 { color=blue - 251 [label="Enter when branch condition "]; - 252 [label="Access variable R|/x|"]; - 253 [label="Const: Null(null)"]; - 254 [label="Operator !="]; - 255 [label="Exit when branch condition"]; + 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"]; } - 256 [label="Synthetic else branch"]; - 257 [label="Enter when branch result"]; + 268 [label="Synthetic else branch"]; + 258 [label="Enter when branch result"]; subgraph cluster_55 { color=blue - 258 [label="Enter block"]; - 259 [label="Access variable R|/x|"]; - 260 [label="Access variable R|kotlin/String.length|"]; - 261 [label="Access variable R|/y|"]; - 262 [label="Access variable #"]; - 263 [label="Access variable R|/z|"]; - 264 [label="Access variable R|kotlin/String.length|"]; - 265 [label="Exit block"]; - } - 266 [label="Exit when branch result"]; - 267 [label="Exit when"]; + 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 - 268 [label="Enter when"]; + 269 [label="Enter when"]; subgraph cluster_57 { color=blue - 269 [label="Enter when branch condition "]; - 270 [label="Access variable R|/y|"]; - 271 [label="Const: Null(null)"]; - 272 [label="Operator !="]; - 273 [label="Exit when branch condition"]; + 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"]; } - 274 [label="Synthetic else branch"]; - 275 [label="Enter when branch result"]; + 286 [label="Synthetic else branch"]; + 276 [label="Enter when branch result"]; subgraph cluster_58 { color=blue - 276 [label="Enter block"]; - 277 [label="Access variable R|/x|"]; - 278 [label="Access variable #"]; - 279 [label="Access variable R|/y|"]; - 280 [label="Access variable R|kotlin/String.length|"]; - 281 [label="Access variable R|/z|"]; - 282 [label="Access variable #"]; - 283 [label="Exit block"]; - } - 284 [label="Exit when branch result"]; - 285 [label="Exit when"]; + 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 - 286 [label="Enter when"]; + 287 [label="Enter when"]; subgraph cluster_60 { color=blue - 287 [label="Enter when branch condition "]; - 288 [label="Access variable R|/z|"]; - 289 [label="Const: Null(null)"]; - 290 [label="Operator !="]; - 291 [label="Exit when branch condition"]; + 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"]; } - 292 [label="Synthetic else branch"]; - 293 [label="Enter when branch result"]; + 304 [label="Synthetic else branch"]; + 294 [label="Enter when branch result"]; subgraph cluster_61 { color=blue - 294 [label="Enter block"]; - 295 [label="Access variable R|/x|"]; - 296 [label="Access variable R|kotlin/String.length|"]; - 297 [label="Access variable R|/y|"]; - 298 [label="Access variable #"]; - 299 [label="Access variable R|/z|"]; - 300 [label="Access variable R|kotlin/String.length|"]; - 301 [label="Exit block"]; - } - 302 [label="Exit when branch result"]; - 303 [label="Exit when"]; + 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"]; } - 304 [label="Exit function test_7" style="filled" fillcolor=red]; + 188 [label="Exit function test_7" style="filled" fillcolor=red]; } - - 187 -> {188}; - 188 -> {189}; + 187 -> {189}; 189 -> {190}; 190 -> {191}; 191 -> {192}; 192 -> {193}; 193 -> {194}; 194 -> {195}; - 195 -> {196}; - 196 -> {197}; + 195 -> {197}; + 196 -> {213}; 197 -> {198}; 198 -> {199}; - 199 -> {201 200}; - 200 -> {211}; - 201 -> {202}; + 199 -> {200}; + 200 -> {201}; + 201 -> {202 212}; 202 -> {203}; 203 -> {204}; 204 -> {205}; @@ -717,15 +705,15 @@ digraph boundSmartcastsInBranches_kt { 208 -> {209}; 209 -> {210}; 210 -> {211}; - 211 -> {212}; - 212 -> {213}; - 213 -> {214}; - 214 -> {215}; + 211 -> {196}; + 212 -> {196}; + 213 -> {215}; + 214 -> {231}; 215 -> {216}; 216 -> {217}; - 217 -> {219 218}; - 218 -> {229}; - 219 -> {220}; + 217 -> {218}; + 218 -> {219}; + 219 -> {220 230}; 220 -> {221}; 221 -> {222}; 222 -> {223}; @@ -735,15 +723,15 @@ digraph boundSmartcastsInBranches_kt { 226 -> {227}; 227 -> {228}; 228 -> {229}; - 229 -> {230}; - 230 -> {231}; - 231 -> {232}; - 232 -> {233}; + 229 -> {214}; + 230 -> {214}; + 231 -> {233}; + 232 -> {249}; 233 -> {234}; 234 -> {235}; - 235 -> {237 236}; - 236 -> {247}; - 237 -> {238}; + 235 -> {236}; + 236 -> {237}; + 237 -> {238 248}; 238 -> {239}; 239 -> {240}; 240 -> {241}; @@ -753,17 +741,17 @@ digraph boundSmartcastsInBranches_kt { 244 -> {245}; 245 -> {246}; 246 -> {247}; - 247 -> {248}; - 248 -> {249}; + 247 -> {232}; + 248 -> {232}; 249 -> {250}; 250 -> {251}; - 251 -> {252}; - 252 -> {253}; + 251 -> {253}; + 252 -> {269}; 253 -> {254}; 254 -> {255}; - 255 -> {257 256}; - 256 -> {267}; - 257 -> {258}; + 255 -> {256}; + 256 -> {257}; + 257 -> {258 268}; 258 -> {259}; 259 -> {260}; 260 -> {261}; @@ -773,15 +761,15 @@ digraph boundSmartcastsInBranches_kt { 264 -> {265}; 265 -> {266}; 266 -> {267}; - 267 -> {268}; - 268 -> {269}; - 269 -> {270}; - 270 -> {271}; + 267 -> {252}; + 268 -> {252}; + 269 -> {271}; + 270 -> {287}; 271 -> {272}; 272 -> {273}; - 273 -> {275 274}; - 274 -> {285}; - 275 -> {276}; + 273 -> {274}; + 274 -> {275}; + 275 -> {276 286}; 276 -> {277}; 277 -> {278}; 278 -> {279}; @@ -791,15 +779,15 @@ digraph boundSmartcastsInBranches_kt { 282 -> {283}; 283 -> {284}; 284 -> {285}; - 285 -> {286}; - 286 -> {287}; - 287 -> {288}; - 288 -> {289}; + 285 -> {270}; + 286 -> {270}; + 287 -> {289}; + 288 -> {188}; 289 -> {290}; 290 -> {291}; - 291 -> {293 292}; - 292 -> {303}; - 293 -> {294}; + 291 -> {292}; + 292 -> {293}; + 293 -> {294 304}; 294 -> {295}; 295 -> {296}; 296 -> {297}; @@ -809,6 +797,7 @@ digraph boundSmartcastsInBranches_kt { 300 -> {301}; 301 -> {302}; 302 -> {303}; - 303 -> {304}; + 303 -> {288}; + 304 -> {288}; } 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 197df0836d2..066f12b4870 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot @@ -6,114 +6,108 @@ digraph functionCallBound_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter class Base" style="filled" fillcolor=red]; 4 [label="Exit class Base" style="filled" fillcolor=red]; } - 3 -> {4} [color=green]; subgraph cluster_2 { color=red 5 [label="Enter function " style="filled" fillcolor=red]; - 6 [label="Delegated constructor call: super()"]; - 7 [label="Exit function " style="filled" fillcolor=red]; + 7 [label="Delegated constructor call: super()"]; + 6 [label="Exit function " style="filled" fillcolor=red]; } - - 5 -> {6}; - 6 -> {7}; + 5 -> {7}; + 7 -> {6}; subgraph cluster_3 { color=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 - 10 [label="Enter property" style="filled" fillcolor=red]; - 11 [label="Access variable R|/data|"]; - 12 [label="Exit property" style="filled" fillcolor=red]; - } - - 10 -> {11}; - 11 -> {12}; - - subgraph cluster_5 { color=red 13 [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 -> {10} [color=green]; + 10 -> {12}; + 11 -> {14} [color=green]; + 12 -> {11}; subgraph cluster_6 { color=red 15 [label="Enter function isOk" style="filled" fillcolor=red]; - 16 [label="Const: Boolean(true)"]; - 17 [label="Jump: ^isOk Boolean(true)"]; - 18 [label="Stub" style="filled" fillcolor=gray]; - 19 [label="Exit function isOk" style="filled" fillcolor=red]; + 17 [label="Const: Boolean(true)"]; + 18 [label="Jump: ^isOk Boolean(true)"]; + 19 [label="Stub" style="filled" fillcolor=gray]; + 16 [label="Exit function isOk" style="filled" fillcolor=red]; } - - 15 -> {16}; - 16 -> {17}; - 17 -> {19}; - 17 -> {18} [style=dotted]; + 15 -> {17}; + 17 -> {18}; + 18 -> {16}; 18 -> {19} [style=dotted]; + 19 -> {16} [style=dotted]; subgraph cluster_7 { color=red 20 [label="Enter function check" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue - 21 [label="Enter when"]; + 22 [label="Enter when"]; subgraph cluster_9 { color=blue - 22 [label="Enter when branch condition "]; - 23 [label="Access variable R|/base|"]; - 24 [label="Type operator: (R|/base| as? R|Sub|)"]; - 25 [label="Enter safe call"]; - 26 [label="Function call: (R|/base| as? R|Sub|)?.R|/isOk|()"]; - 27 [label="Exit safe call"]; - 28 [label="Const: Boolean(true)"]; - 29 [label="Operator =="]; - 30 [label="Exit when branch condition"]; + 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: (R|/base| as? R|Sub|)?.R|/isOk|()"]; + 28 [label="Exit safe call"]; + 30 [label="Const: Boolean(true)"]; + 31 [label="Operator =="]; + 32 [label="Exit when branch condition"]; } subgraph cluster_10 { color=blue - 31 [label="Enter when branch condition else"]; - 32 [label="Exit when branch condition"]; + 39 [label="Enter when branch condition else"]; + 40 [label="Exit when branch condition"]; } - 33 [label="Enter when branch result"]; + 41 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 34 [label="Enter block"]; - 35 [label="Access variable R|/base|"]; - 36 [label="Exit block"]; + 42 [label="Enter block"]; + 43 [label="Access variable R|/base|"]; + 44 [label="Exit block"]; } - 37 [label="Exit when branch result"]; - 38 [label="Enter when branch result"]; + 45 [label="Exit when branch result"]; + 33 [label="Enter when branch result"]; subgraph cluster_12 { color=blue - 39 [label="Enter block"]; - 40 [label="Access variable R|/base|"]; - 41 [label="Access variable R|/Sub.data|"]; - 42 [label="Exit block"]; + 34 [label="Enter block"]; + 35 [label="Access variable R|/base|"]; + 36 [label="Access variable R|/Sub.data|"]; + 37 [label="Exit block"]; } - 43 [label="Exit when branch result"]; - 44 [label="Exit when"]; + 38 [label="Exit when branch result"]; + 23 [label="Exit when"]; } - 45 [label="Jump: ^check when () { + 46 [label="Jump: ^check when () { ==((R|/base| as? R|Sub|)?.R|/isOk|(), Boolean(true)) -> { R|/base|.R|/Sub.data| } @@ -122,37 +116,36 @@ digraph functionCallBound_kt { } } "]; - 46 [label="Stub" style="filled" fillcolor=gray]; - 47 [label="Exit function check" style="filled" fillcolor=red]; + 47 [label="Stub" style="filled" fillcolor=gray]; + 21 [label="Exit function check" style="filled" fillcolor=red]; } - - 20 -> {21}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; - 24 -> {25 27}; + 20 -> {22}; + 22 -> {24}; + 23 -> {46}; + 24 -> {25}; 25 -> {26}; - 26 -> {27}; - 27 -> {28}; - 28 -> {29}; - 29 -> {30}; - 30 -> {38 31}; + 26 -> {27 28}; + 27 -> {29}; + 28 -> {30}; + 29 -> {28}; + 30 -> {31}; 31 -> {32}; - 32 -> {33}; + 32 -> {33 39}; 33 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {44}; - 38 -> {39}; + 37 -> {38}; + 38 -> {23}; 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; 44 -> {45}; - 45 -> {47}; - 45 -> {46} [style=dotted]; + 45 -> {23}; + 46 -> {21}; 46 -> {47} [style=dotted]; + 47 -> {21} [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 26959b76551..db014223517 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/casts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/casts.dot @@ -6,334 +6,329 @@ digraph casts_kt { subgraph cluster_0 { color=red 0 [label="Enter function test_1" style="filled" fillcolor=red]; - 1 [label="Access variable R|/x|"]; - 2 [label="Type operator: (R|/x| as R|kotlin/String|)"]; - 3 [label="Access variable R|/x|"]; - 4 [label="Access variable R|kotlin/String.length|"]; - 5 [label="Exit 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|"]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; 2 -> {3}; 3 -> {4}; 4 -> {5}; + 5 -> {1}; subgraph cluster_1 { color=red 6 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_2 { color=blue - 7 [label="Enter when"]; + 8 [label="Enter when"]; subgraph cluster_3 { color=blue - 8 [label="Enter when branch condition "]; - 9 [label="Access variable R|/x|"]; - 10 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; - 11 [label="Exit when branch condition"]; + 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"]; } - 12 [label="Synthetic else branch"]; - 13 [label="Enter when branch result"]; + 20 [label="Synthetic else branch"]; + 14 [label="Enter when branch result"]; subgraph cluster_4 { color=blue - 14 [label="Enter block"]; - 15 [label="Access variable R|/x|"]; - 16 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; - 17 [label="Exit block"]; + 15 [label="Enter block"]; + 16 [label="Access variable R|/x|"]; + 17 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; + 18 [label="Exit block"]; } - 18 [label="Exit when branch result"]; - 19 [label="Exit when"]; + 19 [label="Exit when branch result"]; + 9 [label="Exit when"]; } - 20 [label="Access variable R|/x|"]; - 21 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; - 22 [label="Exit function test_2" style="filled" fillcolor=red]; + 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]; } - - 6 -> {7}; - 7 -> {8}; - 8 -> {9}; - 9 -> {10}; + 6 -> {8}; + 8 -> {10}; + 9 -> {21}; 10 -> {11}; - 11 -> {13 12}; - 12 -> {19}; - 13 -> {14}; + 11 -> {12}; + 12 -> {13}; + 13 -> {14 20}; 14 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; - 19 -> {20}; - 20 -> {21}; + 19 -> {9}; + 20 -> {9}; 21 -> {22}; + 22 -> {7}; subgraph cluster_5 { color=red 23 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 24 [label="Enter when"]; + 25 [label="Enter when"]; subgraph cluster_7 { color=blue - 25 [label="Enter when branch condition "]; + 27 [label="Enter when branch condition "]; subgraph cluster_8 { color=blue - 26 [label="Enter &&"]; - 27 [label="Access variable R|/b|"]; - 28 [label="Exit left part of &&"]; - 29 [label="Enter right part of &&"]; - 30 [label="Access variable R|/x|"]; - 31 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; - 32 [label="Exit &&"]; + 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 &&"]; } - 33 [label="Exit when branch condition"]; + 35 [label="Exit when branch condition"]; } - 34 [label="Synthetic else branch"]; - 35 [label="Enter when branch result"]; + 42 [label="Synthetic else branch"]; + 36 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 36 [label="Enter block"]; - 37 [label="Access variable R|/x|"]; - 38 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; - 39 [label="Exit block"]; + 37 [label="Enter block"]; + 38 [label="Access variable R|/x|"]; + 39 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; + 40 [label="Exit block"]; } - 40 [label="Exit when branch result"]; - 41 [label="Exit when"]; + 41 [label="Exit when branch result"]; + 26 [label="Exit when"]; } - 42 [label="Access variable R|/x|"]; - 43 [label="Function call: R|/x|.#()"]; + 43 [label="Access variable R|/x|"]; + 44 [label="Function call: R|/x|.#()"]; subgraph cluster_10 { color=blue - 44 [label="Enter when"]; + 45 [label="Enter when"]; subgraph cluster_11 { color=blue - 45 [label="Enter when branch condition "]; + 47 [label="Enter when branch condition "]; subgraph cluster_12 { color=blue - 46 [label="Enter &&"]; - 47 [label="Access variable 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| as R|kotlin/Boolean|)"]; - 52 [label="Const: Boolean(true)"]; - 53 [label="Operator =="]; - 54 [label="Exit &&"]; + 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 &&"]; } - 55 [label="Exit when branch condition"]; + 57 [label="Exit when branch condition"]; } - 56 [label="Synthetic else branch"]; - 57 [label="Enter when branch result"]; + 64 [label="Synthetic else branch"]; + 58 [label="Enter when branch result"]; subgraph cluster_13 { color=blue - 58 [label="Enter block"]; - 59 [label="Access variable R|/x|"]; - 60 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; - 61 [label="Exit block"]; + 59 [label="Enter block"]; + 60 [label="Access variable R|/x|"]; + 61 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; + 62 [label="Exit block"]; } - 62 [label="Exit when branch result"]; - 63 [label="Exit when"]; + 63 [label="Exit when branch result"]; + 46 [label="Exit when"]; } - 64 [label="Access variable R|/x|"]; - 65 [label="Function call: R|/x|.#()"]; + 65 [label="Access variable R|/x|"]; + 66 [label="Function call: R|/x|.#()"]; subgraph cluster_14 { color=blue - 66 [label="Enter when"]; + 67 [label="Enter when"]; subgraph cluster_15 { color=blue - 67 [label="Enter when branch condition "]; + 69 [label="Enter when branch condition "]; subgraph cluster_16 { color=blue - 68 [label="Enter ||"]; - 69 [label="Access variable R|/b|"]; - 70 [label="Exit left part of ||"]; - 71 [label="Enter right part of ||"]; - 72 [label="Access variable R|/x|"]; - 73 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; - 74 [label="Exit ||"]; + 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 ||"]; } - 75 [label="Exit when branch condition"]; + 77 [label="Exit when branch condition"]; } - 76 [label="Synthetic else branch"]; - 77 [label="Enter when branch result"]; + 84 [label="Synthetic else branch"]; + 78 [label="Enter when branch result"]; subgraph cluster_17 { color=blue - 78 [label="Enter block"]; - 79 [label="Access variable R|/x|"]; - 80 [label="Function call: R|/x|.#()"]; - 81 [label="Exit block"]; + 79 [label="Enter block"]; + 80 [label="Access variable R|/x|"]; + 81 [label="Function call: R|/x|.#()"]; + 82 [label="Exit block"]; } - 82 [label="Exit when branch result"]; - 83 [label="Exit when"]; + 83 [label="Exit when branch result"]; + 68 [label="Exit when"]; } - 84 [label="Access variable R|/x|"]; - 85 [label="Function call: R|/x|.#()"]; - 86 [label="Exit function test_3" style="filled" fillcolor=red]; + 85 [label="Access variable R|/x|"]; + 86 [label="Function call: R|/x|.#()"]; + 24 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 23 -> {24}; - 24 -> {25}; - 25 -> {26}; - 26 -> {27}; - 27 -> {28}; - 28 -> {32 29}; + 23 -> {25}; + 25 -> {27}; + 26 -> {43}; + 27 -> {29}; + 28 -> {35}; 29 -> {30}; 30 -> {31}; - 31 -> {32}; + 31 -> {28 32}; 32 -> {33}; - 33 -> {35 34}; - 34 -> {41}; - 35 -> {36}; + 33 -> {34}; + 34 -> {28}; + 35 -> {36 42}; 36 -> {37}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; - 41 -> {42}; - 42 -> {43}; + 41 -> {26}; + 42 -> {26}; 43 -> {44}; 44 -> {45}; - 45 -> {46}; - 46 -> {47}; - 47 -> {48}; - 48 -> {54 49}; + 45 -> {47}; + 46 -> {65}; + 47 -> {49}; + 48 -> {57}; 49 -> {50}; 50 -> {51}; - 51 -> {52}; + 51 -> {48 52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; - 55 -> {57 56}; - 56 -> {63}; - 57 -> {58}; + 55 -> {56}; + 56 -> {48}; + 57 -> {58 64}; 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; - 63 -> {64}; - 64 -> {65}; + 63 -> {46}; + 64 -> {46}; 65 -> {66}; 66 -> {67}; - 67 -> {68}; - 68 -> {69}; - 69 -> {70}; - 70 -> {74 71}; + 67 -> {69}; + 68 -> {85}; + 69 -> {71}; + 70 -> {77}; 71 -> {72}; 72 -> {73}; - 73 -> {74}; + 73 -> {70 74}; 74 -> {75}; - 75 -> {77 76}; - 76 -> {83}; - 77 -> {78}; + 75 -> {76}; + 76 -> {70}; + 77 -> {78 84}; 78 -> {79}; 79 -> {80}; 80 -> {81}; 81 -> {82}; 82 -> {83}; - 83 -> {84}; - 84 -> {85}; + 83 -> {68}; + 84 -> {68}; 85 -> {86}; + 86 -> {24}; subgraph cluster_18 { color=red 87 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_19 { color=blue - 88 [label="Enter when"]; + 89 [label="Enter when"]; subgraph cluster_20 { color=blue - 89 [label="Enter when branch condition "]; - 90 [label="Access variable R|/b|"]; - 91 [label="Type operator: (R|/b| as? R|kotlin/Boolean|)"]; - 92 [label="Const: Null(null)"]; - 93 [label="Operator !="]; - 94 [label="Exit when branch condition"]; + 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 - 95 [label="Enter when branch condition else"]; - 96 [label="Exit when branch condition"]; + 103 [label="Enter when branch condition else"]; + 104 [label="Exit when branch condition"]; } - 97 [label="Enter when branch result"]; + 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"]; + subgraph cluster_23 { color=blue 98 [label="Enter block"]; 99 [label="Access variable R|/b|"]; - 100 [label="Function call: R|/b|.#()"]; + 100 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; 101 [label="Exit block"]; } 102 [label="Exit when branch result"]; - 103 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 104 [label="Enter block"]; - 105 [label="Access variable R|/b|"]; - 106 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 107 [label="Exit block"]; - } - 108 [label="Exit when branch result"]; - 109 [label="Exit when"]; + 90 [label="Exit when"]; } - 110 [label="Access variable R|/b|"]; - 111 [label="Function call: R|/b|.#()"]; + 111 [label="Access variable R|/b|"]; + 112 [label="Function call: R|/b|.#()"]; subgraph cluster_24 { color=blue - 112 [label="Enter when"]; + 113 [label="Enter when"]; subgraph cluster_25 { color=blue - 113 [label="Enter when branch condition "]; - 114 [label="Access variable R|/b|"]; - 115 [label="Type operator: (R|/b| as? R|kotlin/Boolean|)"]; - 116 [label="Const: Null(null)"]; - 117 [label="Operator =="]; - 118 [label="Exit when branch condition"]; + 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 - 119 [label="Enter when branch condition else"]; - 120 [label="Exit when branch condition"]; + 127 [label="Enter when branch condition else"]; + 128 [label="Exit when branch condition"]; } - 121 [label="Enter when branch result"]; + 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"]; + subgraph cluster_28 { color=blue 122 [label="Enter block"]; 123 [label="Access variable R|/b|"]; - 124 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 124 [label="Function call: R|/b|.#()"]; 125 [label="Exit block"]; } 126 [label="Exit when branch result"]; - 127 [label="Enter when branch result"]; - subgraph cluster_28 { - color=blue - 128 [label="Enter block"]; - 129 [label="Access variable R|/b|"]; - 130 [label="Function call: R|/b|.#()"]; - 131 [label="Exit block"]; - } - 132 [label="Exit when branch result"]; - 133 [label="Exit when"]; + 114 [label="Exit when"]; } - 134 [label="Access variable R|/b|"]; - 135 [label="Function call: R|/b|.#()"]; - 136 [label="Exit function test_4" style="filled" fillcolor=red]; + 135 [label="Access variable R|/b|"]; + 136 [label="Function call: R|/b|.#()"]; + 88 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 87 -> {88}; - 88 -> {89}; - 89 -> {90}; - 90 -> {91}; + 87 -> {89}; + 89 -> {91}; + 90 -> {111}; 91 -> {92}; 92 -> {93}; 93 -> {94}; - 94 -> {103 95}; + 94 -> {95}; 95 -> {96}; - 96 -> {97}; + 96 -> {97 103}; 97 -> {98}; 98 -> {99}; 99 -> {100}; 100 -> {101}; 101 -> {102}; - 102 -> {109}; + 102 -> {90}; 103 -> {104}; 104 -> {105}; 105 -> {106}; @@ -341,23 +336,23 @@ digraph casts_kt { 107 -> {108}; 108 -> {109}; 109 -> {110}; - 110 -> {111}; + 110 -> {90}; 111 -> {112}; 112 -> {113}; - 113 -> {114}; - 114 -> {115}; + 113 -> {115}; + 114 -> {135}; 115 -> {116}; 116 -> {117}; 117 -> {118}; - 118 -> {127 119}; + 118 -> {119}; 119 -> {120}; - 120 -> {121}; + 120 -> {121 127}; 121 -> {122}; 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {133}; + 126 -> {114}; 127 -> {128}; 128 -> {129}; 129 -> {130}; @@ -365,7 +360,8 @@ digraph casts_kt { 131 -> {132}; 132 -> {133}; 133 -> {134}; - 134 -> {135}; + 134 -> {114}; 135 -> {136}; + 136 -> {88}; } 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 3f6a6e63271..446755c0c89 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot @@ -8,7 +8,6 @@ digraph elvis_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,212 +15,209 @@ digraph elvis_kt { 2 [label="Enter function getter" style="filled" fillcolor=red]; 3 [label="Exit function getter" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { - color=red - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Exit property" style="filled" fillcolor=red]; - } - - 4 -> {5}; - - subgraph cluster_3 { color=red 6 [label="Enter class A" 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]; } - + 6 -> {4} [color=green]; + 4 -> {5}; + 5 -> {7} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 9 [label="Enter when"]; + 10 [label="Enter when"]; subgraph cluster_6 { color=blue - 10 [label="Enter when branch condition "]; + 12 [label="Enter when branch condition "]; subgraph cluster_7 { color=blue - 11 [label="Enter when"]; - 12 [label="Access variable R|/x|"]; - 13 [label="Enter safe call"]; - 14 [label="Access variable R|/A.b|"]; - 15 [label="Exit safe call"]; - 16 [label="Variable declaration: lval : R|kotlin/Boolean?|"]; + 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 - 17 [label="Enter when branch condition "]; - 18 [label="Const: Null(null)"]; - 19 [label="Operator =="]; - 20 [label="Exit when branch condition"]; + 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 - 21 [label="Enter when branch condition else"]; - 22 [label="Exit when branch condition"]; + 30 [label="Enter when branch condition else"]; + 31 [label="Exit when branch condition"]; } - 23 [label="Enter when branch result"]; + 32 [label="Enter when branch result"]; subgraph cluster_10 { color=blue - 24 [label="Enter block"]; - 25 [label="Access variable R|/|"]; - 26 [label="Exit block"]; + 33 [label="Enter block"]; + 34 [label="Access variable R|/|"]; + 35 [label="Exit block"]; } - 27 [label="Exit when branch result"]; - 28 [label="Enter when branch result"]; + 36 [label="Exit when branch result"]; + 24 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 29 [label="Enter block"]; - 30 [label="Jump: ^test_1 Unit"]; - 31 [label="Stub" style="filled" fillcolor=gray]; - 32 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 33 [label="Exit when branch result" style="filled" fillcolor=gray]; - 34 [label="Exit when"]; + 29 [label="Exit when branch result" style="filled" fillcolor=gray]; + 14 [label="Exit when"]; } - 35 [label="Exit when branch condition"]; + 37 [label="Exit when branch condition"]; } - 36 [label="Synthetic else branch"]; - 37 [label="Enter when branch result"]; + 44 [label="Synthetic else branch"]; + 38 [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"]; + 39 [label="Enter block"]; + 40 [label="Access variable R|/x|"]; + 41 [label="Function call: R|/x|.R|/A.foo|()"]; + 42 [label="Exit block"]; } - 42 [label="Exit when branch result"]; - 43 [label="Exit when"]; + 43 [label="Exit when branch result"]; + 11 [label="Exit when"]; } - 44 [label="Exit function test_1" style="filled" fillcolor=red]; + 9 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {13 15}; - 13 -> {14}; - 14 -> {15}; - 15 -> {16}; - 16 -> {17}; - 17 -> {18}; - 18 -> {19}; + 8 -> {10}; + 10 -> {12}; + 11 -> {9}; + 12 -> {13}; + 13 -> {15}; + 14 -> {37}; + 15 -> {16 17}; + 16 -> {18}; + 17 -> {19}; + 18 -> {17}; 19 -> {20}; - 20 -> {28 21}; + 20 -> {21}; 21 -> {22}; 22 -> {23}; - 23 -> {24}; + 23 -> {24 30}; 24 -> {25}; 25 -> {26}; - 26 -> {27}; - 27 -> {34}; - 28 -> {29}; - 29 -> {30}; - 30 -> {44}; - 30 -> {31} [style=dotted]; - 31 -> {32} [style=dotted]; - 32 -> {33} [style=dotted]; - 33 -> {34} [style=dotted]; + 26 -> {9}; + 26 -> {27} [style=dotted]; + 27 -> {28} [style=dotted]; + 28 -> {29} [style=dotted]; + 29 -> {14} [style=dotted]; + 30 -> {31}; + 31 -> {32}; + 32 -> {33}; + 33 -> {34}; 34 -> {35}; - 35 -> {37 36}; - 36 -> {43}; - 37 -> {38}; + 35 -> {36}; + 36 -> {14}; + 37 -> {38 44}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; - 43 -> {44}; + 43 -> {11}; + 44 -> {11}; subgraph cluster_13 { color=red 45 [label="Enter function test2" style="filled" fillcolor=red]; subgraph cluster_14 { color=blue - 46 [label="Enter when"]; + 47 [label="Enter when"]; subgraph cluster_15 { color=blue - 47 [label="Enter when branch condition "]; - 48 [label="Access variable R|/b|"]; - 49 [label="Type operator: (R|/b| !is R|kotlin/String|)"]; - 50 [label="Exit when branch condition"]; + 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"]; } - 51 [label="Synthetic else branch"]; - 52 [label="Enter when branch result"]; + 60 [label="Synthetic else branch"]; + 53 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 53 [label="Enter block"]; - 54 [label="Const: String()"]; - 55 [label="Jump: ^test2 String()"]; - 56 [label="Stub" style="filled" fillcolor=gray]; - 57 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 58 [label="Exit when branch result" style="filled" fillcolor=gray]; - 59 [label="Exit when"]; + 59 [label="Exit when branch result" style="filled" fillcolor=gray]; + 48 [label="Exit when"]; } subgraph cluster_17 { color=blue - 60 [label="Enter when"]; + 61 [label="Enter when"]; subgraph cluster_18 { color=blue - 61 [label="Enter when branch condition "]; - 62 [label="Access variable R|/a|"]; - 63 [label="Type operator: (R|/a| !is R|kotlin/String?|)"]; - 64 [label="Exit when branch condition"]; + 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"]; } - 65 [label="Synthetic else branch"]; - 66 [label="Enter when branch result"]; + 74 [label="Synthetic else branch"]; + 67 [label="Enter when branch result"]; subgraph cluster_19 { color=blue - 67 [label="Enter block"]; - 68 [label="Const: String()"]; - 69 [label="Jump: ^test2 String()"]; - 70 [label="Stub" style="filled" fillcolor=gray]; - 71 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 72 [label="Exit when branch result" style="filled" fillcolor=gray]; - 73 [label="Exit when"]; + 73 [label="Exit when branch result" style="filled" fillcolor=gray]; + 62 [label="Exit when"]; } subgraph cluster_20 { color=blue - 74 [label="Enter when"]; - 75 [label="Access variable R|/a|"]; - 76 [label="Variable declaration: lval : R|kotlin/String?|"]; + 75 [label="Enter when"]; + 77 [label="Access variable R|/a|"]; + 78 [label="Variable declaration: lval : R|kotlin/String?|"]; subgraph cluster_21 { color=blue - 77 [label="Enter when branch condition "]; - 78 [label="Const: Null(null)"]; - 79 [label="Operator =="]; - 80 [label="Exit when branch condition"]; + 79 [label="Enter when branch condition "]; + 80 [label="Const: Null(null)"]; + 81 [label="Operator =="]; + 82 [label="Exit when branch condition"]; } subgraph cluster_22 { color=blue - 81 [label="Enter when branch condition else"]; - 82 [label="Exit when branch condition"]; + 88 [label="Enter when branch condition else"]; + 89 [label="Exit when branch condition"]; } - 83 [label="Enter when branch result"]; + 90 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 84 [label="Enter block"]; - 85 [label="Access variable R|/|"]; - 86 [label="Exit block"]; + 91 [label="Enter block"]; + 92 [label="Access variable R|/|"]; + 93 [label="Exit block"]; } - 87 [label="Exit when branch result"]; - 88 [label="Enter when branch result"]; + 94 [label="Exit when branch result"]; + 83 [label="Enter when branch result"]; subgraph cluster_24 { color=blue - 89 [label="Enter block"]; - 90 [label="Access variable R|/b|"]; - 91 [label="Exit block"]; + 84 [label="Enter block"]; + 85 [label="Access variable R|/b|"]; + 86 [label="Exit block"]; } - 92 [label="Exit when branch result"]; - 93 [label="Exit when"]; + 87 [label="Exit when branch result"]; + 76 [label="Exit when"]; } - 94 [label="Jump: ^test2 when (lval : R|kotlin/String?| = R|/a|) { + 95 [label="Jump: ^test2 when (lval : R|kotlin/String?| = R|/a|) { ==($subj$, Null(null)) -> { R|/b| } @@ -230,63 +226,62 @@ digraph elvis_kt { } } "]; - 95 [label="Stub" style="filled" fillcolor=gray]; - 96 [label="Exit function test2" style="filled" fillcolor=red]; + 96 [label="Stub" style="filled" fillcolor=gray]; + 46 [label="Exit function test2" style="filled" fillcolor=red]; } - - 45 -> {46}; - 46 -> {47}; - 47 -> {48}; - 48 -> {49}; + 45 -> {47}; + 47 -> {49}; + 48 -> {61}; 49 -> {50}; - 50 -> {52 51}; - 51 -> {59}; - 52 -> {53}; + 50 -> {51}; + 51 -> {52}; + 52 -> {53 60}; 53 -> {54}; 54 -> {55}; - 55 -> {96}; - 55 -> {56} [style=dotted]; + 55 -> {56}; + 56 -> {46}; 56 -> {57} [style=dotted]; 57 -> {58} [style=dotted]; 58 -> {59} [style=dotted]; - 59 -> {60}; - 60 -> {61}; - 61 -> {62}; - 62 -> {63}; + 59 -> {48} [style=dotted]; + 60 -> {48}; + 61 -> {63}; + 62 -> {75}; 63 -> {64}; - 64 -> {66 65}; - 65 -> {73}; - 66 -> {67}; + 64 -> {65}; + 65 -> {66}; + 66 -> {67 74}; 67 -> {68}; 68 -> {69}; - 69 -> {96}; - 69 -> {70} [style=dotted]; + 69 -> {70}; + 70 -> {46}; 70 -> {71} [style=dotted]; 71 -> {72} [style=dotted]; 72 -> {73} [style=dotted]; - 73 -> {74}; - 74 -> {75}; - 75 -> {76}; - 76 -> {77}; + 73 -> {62} [style=dotted]; + 74 -> {62}; + 75 -> {77}; + 76 -> {95}; 77 -> {78}; 78 -> {79}; 79 -> {80}; - 80 -> {88 81}; + 80 -> {81}; 81 -> {82}; - 82 -> {83}; + 82 -> {83 88}; 83 -> {84}; 84 -> {85}; 85 -> {86}; 86 -> {87}; - 87 -> {93}; + 87 -> {76}; 88 -> {89}; 89 -> {90}; 90 -> {91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; - 94 -> {96}; - 94 -> {95} [style=dotted]; + 94 -> {76}; + 95 -> {46}; 95 -> {96} [style=dotted]; + 96 -> {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 ae2ec0ee2f0..853a97e2958 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot @@ -8,138 +8,135 @@ digraph returns_kt { 0 [label="Enter function test_0" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; + 2 [label="Enter when"]; subgraph cluster_2 { color=blue - 2 [label="Enter when branch condition "]; - 3 [label="Access variable R|/x|"]; - 4 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 5 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_3 { color=blue - 6 [label="Enter when branch condition else"]; - 7 [label="Exit when branch condition"]; + 14 [label="Enter when branch condition else"]; + 15 [label="Exit when branch condition"]; } - 8 [label="Enter when branch result"]; + 16 [label="Enter when branch result"]; subgraph cluster_4 { color=blue - 9 [label="Enter block"]; - 10 [label="Exit block"]; + 17 [label="Enter block"]; + 18 [label="Exit block"]; } - 11 [label="Exit when branch result"]; - 12 [label="Enter when branch result"]; + 19 [label="Exit when branch result"]; + 8 [label="Enter when branch result"]; subgraph cluster_5 { color=blue - 13 [label="Enter block"]; - 14 [label="Access variable R|/x|"]; - 15 [label="Access variable R|kotlin/String.length|"]; - 16 [label="Exit block"]; + 9 [label="Enter block"]; + 10 [label="Access variable R|/x|"]; + 11 [label="Access variable R|kotlin/String.length|"]; + 12 [label="Exit block"]; } - 17 [label="Exit when branch result"]; - 18 [label="Exit when"]; + 13 [label="Exit when branch result"]; + 3 [label="Exit when"]; } - 19 [label="Access variable R|/x|"]; - 20 [label="Access variable #"]; - 21 [label="Exit function test_0" style="filled" fillcolor=red]; + 20 [label="Access variable R|/x|"]; + 21 [label="Access variable #"]; + 1 [label="Exit function test_0" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; + 0 -> {2}; + 2 -> {4}; + 3 -> {20}; 4 -> {5}; - 5 -> {12 6}; + 5 -> {6}; 6 -> {7}; - 7 -> {8}; + 7 -> {8 14}; 8 -> {9}; 9 -> {10}; 10 -> {11}; - 11 -> {18}; + 11 -> {12}; 12 -> {13}; - 13 -> {14}; + 13 -> {3}; 14 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; - 19 -> {20}; + 19 -> {3}; 20 -> {21}; + 21 -> {1}; subgraph cluster_6 { color=red 22 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue - 23 [label="Enter when"]; + 24 [label="Enter when"]; subgraph cluster_8 { color=blue - 24 [label="Enter when branch condition "]; - 25 [label="Access variable R|/x|"]; - 26 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 27 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_9 { color=blue - 28 [label="Enter when branch condition else"]; - 29 [label="Exit when branch condition"]; + 36 [label="Enter when branch condition else"]; + 37 [label="Exit when branch condition"]; } - 30 [label="Enter when branch result"]; + 38 [label="Enter when branch result"]; subgraph cluster_10 { color=blue - 31 [label="Enter block"]; - 32 [label="Jump: ^test_1 Unit"]; - 33 [label="Stub" style="filled" fillcolor=gray]; - 34 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 35 [label="Exit when branch result" style="filled" fillcolor=gray]; - 36 [label="Enter when branch result"]; + 43 [label="Exit when branch result" style="filled" fillcolor=gray]; + 30 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 37 [label="Enter block"]; - 38 [label="Access variable R|/x|"]; - 39 [label="Access variable R|kotlin/String.length|"]; - 40 [label="Exit block"]; + 31 [label="Enter block"]; + 32 [label="Access variable R|/x|"]; + 33 [label="Access variable R|kotlin/String.length|"]; + 34 [label="Exit block"]; } - 41 [label="Exit when branch result"]; - 42 [label="Exit when"]; + 35 [label="Exit when branch result"]; + 25 [label="Exit when"]; } - 43 [label="Access variable R|/x|"]; - 44 [label="Access variable R|kotlin/String.length|"]; - 45 [label="Exit function test_1" style="filled" fillcolor=red]; + 44 [label="Access variable R|/x|"]; + 45 [label="Access variable R|kotlin/String.length|"]; + 23 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 22 -> {23}; - 23 -> {24}; - 24 -> {25}; - 25 -> {26}; + 22 -> {24}; + 24 -> {26}; + 25 -> {44}; 26 -> {27}; - 27 -> {36 28}; + 27 -> {28}; 28 -> {29}; - 29 -> {30}; + 29 -> {30 36}; 30 -> {31}; 31 -> {32}; - 32 -> {45}; - 32 -> {33} [style=dotted]; - 33 -> {34} [style=dotted]; - 34 -> {35} [style=dotted]; - 35 -> {42} [style=dotted]; + 32 -> {33}; + 33 -> {34}; + 34 -> {35}; + 35 -> {25}; 36 -> {37}; 37 -> {38}; 38 -> {39}; 39 -> {40}; - 40 -> {41}; - 41 -> {42}; - 42 -> {43}; - 43 -> {44}; + 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 { @@ -147,7 +144,6 @@ digraph returns_kt { 48 [label="Enter class A" style="filled" fillcolor=red]; 49 [label="Exit class A" style="filled" fillcolor=red]; } - 48 -> {49} [color=green]; subgraph cluster_14 { @@ -155,7 +151,6 @@ digraph returns_kt { 50 [label="Enter function bar" style="filled" fillcolor=red]; 51 [label="Exit function bar" style="filled" fillcolor=red]; } - 50 -> {51}; subgraph cluster_15 { @@ -163,7 +158,6 @@ digraph returns_kt { 52 [label="Enter class B" style="filled" fillcolor=red]; 53 [label="Exit class B" style="filled" fillcolor=red]; } - 52 -> {53} [color=green]; subgraph cluster_16 { @@ -171,7 +165,6 @@ digraph returns_kt { 54 [label="Enter function baz" style="filled" fillcolor=red]; 55 [label="Exit function baz" style="filled" fillcolor=red]; } - 54 -> {55}; subgraph cluster_17 { @@ -179,7 +172,6 @@ digraph returns_kt { 56 [label="Enter class C" style="filled" fillcolor=red]; 57 [label="Exit class C" style="filled" fillcolor=red]; } - 56 -> {57} [color=green]; subgraph cluster_18 { @@ -187,35 +179,35 @@ digraph returns_kt { 58 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_19 { color=blue - 59 [label="Enter when"]; + 60 [label="Enter when"]; subgraph cluster_20 { color=blue - 60 [label="Enter when branch condition "]; - 61 [label="Access variable R|/x|"]; - 62 [label="Type operator: (R|/x| is R|B|)"]; - 63 [label="Exit when branch condition"]; + 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 - 64 [label="Enter when branch condition "]; - 65 [label="Access variable R|/x|"]; - 66 [label="Type operator: (R|/x| is R|C|)"]; - 67 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_22 { color=blue - 68 [label="Enter when branch condition else"]; - 69 [label="Exit when branch condition"]; + 82 [label="Enter when branch condition else"]; + 83 [label="Exit when branch condition"]; } - 70 [label="Enter when branch result"]; + 84 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 71 [label="Enter block"]; - 72 [label="Jump: ^test_2 Unit"]; - 73 [label="Stub" style="filled" fillcolor=gray]; - 74 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 75 [label="Exit when branch result" 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 @@ -225,280 +217,273 @@ digraph returns_kt { 80 [label="Exit block"]; } 81 [label="Exit when branch result"]; - 82 [label="Enter when branch result"]; + 66 [label="Enter when branch result"]; subgraph cluster_25 { color=blue - 83 [label="Enter block"]; - 84 [label="Access variable R|/x|"]; - 85 [label="Function call: R|/x|.R|/B.bar|()"]; - 86 [label="Exit block"]; + 67 [label="Enter block"]; + 68 [label="Access variable R|/x|"]; + 69 [label="Function call: R|/x|.R|/B.bar|()"]; + 70 [label="Exit block"]; } - 87 [label="Exit when branch result"]; - 88 [label="Exit when"]; + 71 [label="Exit when branch result"]; + 61 [label="Exit when"]; } - 89 [label="Access variable R|/x|"]; - 90 [label="Function call: R|/x|.R|/A.foo|()"]; - 91 [label="Access variable R|/x|"]; - 92 [label="Function call: R|/x|.#()"]; - 93 [label="Access variable R|/x|"]; - 94 [label="Function call: R|/x|.#()"]; - 95 [label="Exit function test_2" style="filled" fillcolor=red]; + 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]; } - - 58 -> {59}; - 59 -> {60}; - 60 -> {61}; - 61 -> {62}; + 58 -> {60}; + 60 -> {62}; + 61 -> {90}; 62 -> {63}; - 63 -> {82 64}; + 63 -> {64}; 64 -> {65}; - 65 -> {66}; + 65 -> {66 72}; 66 -> {67}; - 67 -> {76 68}; + 67 -> {68}; 68 -> {69}; 69 -> {70}; 70 -> {71}; - 71 -> {72}; - 72 -> {95}; - 72 -> {73} [style=dotted]; - 73 -> {74} [style=dotted]; - 74 -> {75} [style=dotted]; - 75 -> {88} [style=dotted]; + 71 -> {61}; + 72 -> {73}; + 73 -> {74}; + 74 -> {75}; + 75 -> {76 82}; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; 80 -> {81}; - 81 -> {88}; + 81 -> {61}; 82 -> {83}; 83 -> {84}; 84 -> {85}; 85 -> {86}; - 86 -> {87}; - 87 -> {88}; - 88 -> {89}; - 89 -> {90}; + 86 -> {59}; + 86 -> {87} [style=dotted]; + 87 -> {88} [style=dotted]; + 88 -> {89} [style=dotted]; + 89 -> {61} [style=dotted]; 90 -> {91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; 94 -> {95}; + 95 -> {59}; subgraph cluster_26 { color=red 96 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_27 { color=blue - 97 [label="Enter when"]; + 98 [label="Enter when"]; subgraph cluster_28 { color=blue - 98 [label="Enter when branch condition "]; - 99 [label="Access variable R|/x|"]; - 100 [label="Type operator: (R|/x| is R|B|)"]; - 101 [label="Exit when branch condition"]; + 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 - 102 [label="Enter when branch condition "]; - 103 [label="Access variable R|/x|"]; - 104 [label="Type operator: (R|/x| is R|C|)"]; - 105 [label="Exit when branch condition"]; + 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"]; } - 106 [label="Synthetic else branch"]; - 107 [label="Enter when branch result"]; + 120 [label="Synthetic else branch"]; + 114 [label="Enter when branch result"]; subgraph cluster_30 { color=blue - 108 [label="Enter block"]; - 109 [label="Access variable R|/x|"]; - 110 [label="Function call: R|/x|.R|/C.baz|()"]; - 111 [label="Exit block"]; + 115 [label="Enter block"]; + 116 [label="Access variable R|/x|"]; + 117 [label="Function call: R|/x|.R|/C.baz|()"]; + 118 [label="Exit block"]; } - 112 [label="Exit when branch result"]; - 113 [label="Enter when branch result"]; + 119 [label="Exit when branch result"]; + 104 [label="Enter when branch result"]; subgraph cluster_31 { color=blue - 114 [label="Enter block"]; - 115 [label="Access variable R|/x|"]; - 116 [label="Function call: R|/x|.R|/B.bar|()"]; - 117 [label="Exit block"]; + 105 [label="Enter block"]; + 106 [label="Access variable R|/x|"]; + 107 [label="Function call: R|/x|.R|/B.bar|()"]; + 108 [label="Exit block"]; } - 118 [label="Exit when branch result"]; - 119 [label="Exit when"]; + 109 [label="Exit when branch result"]; + 99 [label="Exit when"]; } - 120 [label="Access variable R|/x|"]; - 121 [label="Function call: R|/x|.#()"]; - 122 [label="Access variable R|/x|"]; - 123 [label="Function call: R|/x|.#()"]; - 124 [label="Access variable R|/x|"]; - 125 [label="Function call: R|/x|.#()"]; - 126 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - - 96 -> {97}; - 97 -> {98}; - 98 -> {99}; - 99 -> {100}; + 96 -> {98}; + 98 -> {100}; + 99 -> {121}; 100 -> {101}; - 101 -> {113 102}; + 101 -> {102}; 102 -> {103}; - 103 -> {104}; + 103 -> {104 110}; 104 -> {105}; - 105 -> {107 106}; - 106 -> {119}; + 105 -> {106}; + 106 -> {107}; 107 -> {108}; 108 -> {109}; - 109 -> {110}; + 109 -> {99}; 110 -> {111}; 111 -> {112}; - 112 -> {119}; - 113 -> {114}; + 112 -> {113}; + 113 -> {114 120}; 114 -> {115}; 115 -> {116}; 116 -> {117}; 117 -> {118}; 118 -> {119}; - 119 -> {120}; - 120 -> {121}; + 119 -> {99}; + 120 -> {99}; 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]; - 128 [label="Function call: R|/f|.R|FakeOverride|()"]; - 129 [label="Jump: ^runHigherOrder R|/f|.R|FakeOverride|()"]; - 130 [label="Stub" style="filled" fillcolor=gray]; - 131 [label="Exit 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 -> {128}; - 128 -> {129}; - 129 -> {131}; - 129 -> {130} [style=dotted]; + 127 -> {129}; + 129 -> {130}; + 130 -> {128}; 130 -> {131} [style=dotted]; + 131 -> {128} [style=dotted]; subgraph cluster_33 { color=red 132 [label="Enter function getter" style="filled" fillcolor=red]; - 133 [label="Access variable R|kotlin/String.length|"]; - 134 [label="Jump: ^ this@R|/ext|.R|kotlin/String.length|"]; - 135 [label="Stub" style="filled" fillcolor=gray]; - 136 [label="Exit 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]; } - - 132 -> {133}; - 133 -> {134}; - 134 -> {136}; - 134 -> {135} [style=dotted]; + 132 -> {134}; + 134 -> {135}; + 135 -> {133}; 135 -> {136} [style=dotted]; + 136 -> {133} [style=dotted]; subgraph cluster_34 { color=red 137 [label="Enter property" style="filled" fillcolor=red]; 138 [label="Exit property" style="filled" fillcolor=red]; } - 137 -> {138}; subgraph cluster_35 { color=red 139 [label="Enter function test_4" style="filled" fillcolor=red]; - 140 [label="Access variable R|/a|"]; - 141 [label="Type operator: (R|/a| as? R|kotlin/String|)"]; - 142 [label="Variable declaration: lval s: R|kotlin/String?|"]; + 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 { color=blue - 143 [label="Enter when"]; - 144 [label="Access variable R|/s|"]; - 145 [label="Enter safe call"]; - 146 [label="Access variable R|/ext|"]; - 147 [label="Exit safe call"]; - 148 [label="Variable declaration: lval : R|kotlin/Int?|"]; + 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 - 149 [label="Enter when branch condition "]; - 150 [label="Const: Null(null)"]; - 151 [label="Operator =="]; - 152 [label="Exit when branch condition"]; + 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 - 153 [label="Enter when branch condition else"]; - 154 [label="Exit when branch condition"]; + 161 [label="Enter when branch condition else"]; + 162 [label="Exit when branch condition"]; } - 155 [label="Enter when branch result"]; + 163 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 156 [label="Enter block"]; - 157 [label="Access variable R|/|"]; - 158 [label="Exit block"]; + 164 [label="Enter block"]; + 165 [label="Access variable R|/|"]; + 166 [label="Exit block"]; } - 159 [label="Exit when branch result"]; - 160 [label="Enter when branch result"]; + 167 [label="Exit when branch result"]; + 155 [label="Enter when branch result"]; subgraph cluster_40 { color=blue - 161 [label="Enter block"]; - 162 [label="Jump: ^test_4 Unit"]; - 163 [label="Stub" style="filled" fillcolor=gray]; - 164 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 165 [label="Exit when branch result" style="filled" fillcolor=gray]; - 166 [label="Exit when"]; + 160 [label="Exit when branch result" style="filled" fillcolor=gray]; + 145 [label="Exit when"]; } - 167 [label="Variable declaration: lval length: R|kotlin/Int|"]; - 168 [label="Postponed enter to lambda"]; - 169 [label="Postponed exit from lambda"]; - 170 [label="Function call: R|/runHigherOrder|(...)"]; - 171 [label="Exit function test_4" style="filled" fillcolor=red]; + 168 [label="Variable declaration: lval length: R|kotlin/Int|"]; + 169 [label="Postponed enter to lambda"]; + 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]; + } + 170 [label="Postponed exit from lambda"]; + 171 [label="Function call: R|/runHigherOrder|(...)"]; + 140 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 139 -> {140}; - 140 -> {141}; + 139 -> {141}; 141 -> {142}; 142 -> {143}; 143 -> {144}; - 144 -> {145 147}; - 145 -> {146}; - 146 -> {147}; - 147 -> {148}; - 148 -> {149}; - 149 -> {150}; + 144 -> {146}; + 145 -> {168}; + 146 -> {147 148}; + 147 -> {149}; + 148 -> {150}; + 149 -> {148}; 150 -> {151}; 151 -> {152}; - 152 -> {160 153}; + 152 -> {153}; 153 -> {154}; - 154 -> {155}; + 154 -> {155 161}; 155 -> {156}; 156 -> {157}; - 157 -> {158}; - 158 -> {159}; - 159 -> {166}; - 160 -> {161}; + 157 -> {140}; + 157 -> {158} [style=dotted]; + 158 -> {159} [style=dotted]; + 159 -> {160} [style=dotted]; + 160 -> {145} [style=dotted]; 161 -> {162}; - 162 -> {171}; - 162 -> {163} [style=dotted]; - 163 -> {164} [style=dotted]; - 164 -> {165} [style=dotted]; - 165 -> {166} [style=dotted]; + 162 -> {163}; + 163 -> {164}; + 164 -> {165}; + 165 -> {166}; 166 -> {167}; - 167 -> {168}; - 168 -> {169 169} [color=green]; - 169 -> {170}; + 167 -> {145}; + 168 -> {169}; + 169 -> {170 170} [color=green]; + 169 -> {172} [color=red]; 170 -> {171}; - - subgraph cluster_41 { - color=red - 172 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 173 [label="Access variable R|/s|"]; - 174 [label="Access variable R|kotlin/String.length|"]; - 175 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 172 -> {173}; - 173 -> {174}; + 171 -> {140}; + 172 -> {174}; 174 -> {175}; + 175 -> {173}; } 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 edf973d71e3..40becd85207 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/simpleIf.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/simpleIf.dot @@ -8,182 +8,179 @@ digraph simpleIf_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; + 2 [label="Enter when"]; subgraph cluster_2 { color=blue - 2 [label="Enter when branch condition "]; - 3 [label="Access variable R|/x|"]; - 4 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 5 [label="Exit when branch condition"]; + 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"]; } - 6 [label="Synthetic else branch"]; - 7 [label="Enter when branch result"]; + 14 [label="Synthetic else branch"]; + 8 [label="Enter when branch result"]; subgraph cluster_3 { color=blue - 8 [label="Enter block"]; - 9 [label="Access variable R|/x|"]; - 10 [label="Access variable R|kotlin/String.length|"]; - 11 [label="Exit block"]; + 9 [label="Enter block"]; + 10 [label="Access variable R|/x|"]; + 11 [label="Access variable R|kotlin/String.length|"]; + 12 [label="Exit block"]; } - 12 [label="Exit when branch result"]; - 13 [label="Exit when"]; + 13 [label="Exit when branch result"]; + 3 [label="Exit when"]; } - 14 [label="Access variable R|/x|"]; - 15 [label="Access variable #"]; - 16 [label="Exit function test_1" style="filled" fillcolor=red]; + 15 [label="Access variable R|/x|"]; + 16 [label="Access variable #"]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; + 0 -> {2}; + 2 -> {4}; + 3 -> {15}; 4 -> {5}; - 5 -> {7 6}; - 6 -> {13}; - 7 -> {8}; + 5 -> {6}; + 6 -> {7}; + 7 -> {8 14}; 8 -> {9}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {14}; - 14 -> {15}; + 13 -> {3}; + 14 -> {3}; 15 -> {16}; + 16 -> {1}; subgraph cluster_4 { color=red 17 [label="Enter function test_2" style="filled" fillcolor=red]; - 18 [label="Access variable R|/x|"]; - 19 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 20 [label="Variable declaration: lval b: R|kotlin/Boolean|"]; + 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 { color=blue - 21 [label="Enter when"]; + 22 [label="Enter when"]; subgraph cluster_6 { color=blue - 22 [label="Enter when branch condition "]; - 23 [label="Access variable R|/b|"]; - 24 [label="Exit when branch condition"]; + 24 [label="Enter when branch condition "]; + 25 [label="Access variable R|/b|"]; + 26 [label="Exit when branch condition"]; } - 25 [label="Synthetic else branch"]; - 26 [label="Enter when branch result"]; + 33 [label="Synthetic else branch"]; + 27 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 27 [label="Enter block"]; - 28 [label="Access variable R|/x|"]; - 29 [label="Access variable R|kotlin/String.length|"]; - 30 [label="Exit block"]; + 28 [label="Enter block"]; + 29 [label="Access variable R|/x|"]; + 30 [label="Access variable R|kotlin/String.length|"]; + 31 [label="Exit block"]; } - 31 [label="Exit when branch result"]; - 32 [label="Exit when"]; + 32 [label="Exit when branch result"]; + 23 [label="Exit when"]; } - 33 [label="Access variable R|/x|"]; - 34 [label="Access variable #"]; - 35 [label="Exit function test_2" style="filled" fillcolor=red]; + 34 [label="Access variable R|/x|"]; + 35 [label="Access variable #"]; + 18 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 17 -> {18}; - 18 -> {19}; + 17 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {23}; - 23 -> {24}; - 24 -> {26 25}; - 25 -> {32}; - 26 -> {27}; + 22 -> {24}; + 23 -> {34}; + 24 -> {25}; + 25 -> {26}; + 26 -> {27 33}; 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; - 32 -> {33}; - 33 -> {34}; + 32 -> {23}; + 33 -> {23}; 34 -> {35}; + 35 -> {18}; subgraph cluster_8 { color=red 36 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_9 { color=blue - 37 [label="Enter when"]; + 38 [label="Enter when"]; subgraph cluster_10 { color=blue - 38 [label="Enter when branch condition "]; - 39 [label="Access variable R|/x|"]; - 40 [label="Type operator: (R|/x| !is R|kotlin/String|)"]; - 41 [label="Exit when branch condition"]; + 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 - 42 [label="Enter when branch condition "]; - 43 [label="Access variable R|/x|"]; - 44 [label="Type operator: (R|/x| !is R|kotlin/Int|)"]; - 45 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_12 { color=blue - 46 [label="Enter when branch condition else"]; - 47 [label="Exit when branch condition"]; + 56 [label="Enter when branch condition else"]; + 57 [label="Exit when branch condition"]; } - 48 [label="Enter when branch result"]; + 58 [label="Enter when branch result"]; subgraph cluster_13 { color=blue - 49 [label="Enter block"]; - 50 [label="Access variable R|/x|"]; - 51 [label="Access variable R|kotlin/String.length|"]; - 52 [label="Access variable R|/x|"]; - 53 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 54 [label="Exit block"]; + 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"]; } - 55 [label="Exit when branch result"]; - 56 [label="Enter when branch result"]; + 65 [label="Exit when branch result"]; + 52 [label="Enter when branch result"]; subgraph cluster_14 { color=blue - 57 [label="Enter block"]; - 58 [label="Exit block"]; + 53 [label="Enter block"]; + 54 [label="Exit block"]; } - 59 [label="Exit when branch result"]; - 60 [label="Enter when branch result"]; + 55 [label="Exit when branch result"]; + 44 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 61 [label="Enter block"]; - 62 [label="Exit block"]; + 45 [label="Enter block"]; + 46 [label="Exit block"]; } - 63 [label="Exit when branch result"]; - 64 [label="Exit when"]; + 47 [label="Exit when branch result"]; + 39 [label="Exit when"]; } - 65 [label="Exit function test_3" style="filled" fillcolor=red]; + 37 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 36 -> {37}; - 37 -> {38}; - 38 -> {39}; - 39 -> {40}; + 36 -> {38}; + 38 -> {40}; + 39 -> {37}; 40 -> {41}; - 41 -> {60 42}; + 41 -> {42}; 42 -> {43}; - 43 -> {44}; + 43 -> {44 48}; 44 -> {45}; - 45 -> {56 46}; + 45 -> {46}; 46 -> {47}; - 47 -> {48}; + 47 -> {39}; 48 -> {49}; 49 -> {50}; 50 -> {51}; - 51 -> {52}; + 51 -> {52 56}; 52 -> {53}; 53 -> {54}; 54 -> {55}; - 55 -> {64}; + 55 -> {39}; 56 -> {57}; 57 -> {58}; 58 -> {59}; - 59 -> {64}; + 59 -> {60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; 63 -> {64}; 64 -> {65}; + 65 -> {39}; } 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 a2d2329e4ca..414c20d62d6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot @@ -8,7 +8,6 @@ digraph smartcastFromArgument_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,123 +15,120 @@ digraph smartcastFromArgument_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function takeA" style="filled" fillcolor=red]; - 5 [label="Const: Boolean(true)"]; - 6 [label="Jump: ^takeA Boolean(true)"]; - 7 [label="Stub" style="filled" fillcolor=gray]; - 8 [label="Exit function takeA" style="filled" fillcolor=red]; + 6 [label="Const: Boolean(true)"]; + 7 [label="Jump: ^takeA Boolean(true)"]; + 8 [label="Stub" style="filled" fillcolor=gray]; + 5 [label="Exit function takeA" style="filled" fillcolor=red]; } - - 4 -> {5}; - 5 -> {6}; - 6 -> {8}; - 6 -> {7} [style=dotted]; + 4 -> {6}; + 6 -> {7}; + 7 -> {5}; 7 -> {8} [style=dotted]; + 8 -> {5} [style=dotted]; subgraph cluster_3 { color=red 9 [label="Enter function test" style="filled" fillcolor=red]; subgraph cluster_4 { color=blue - 10 [label="Enter when"]; + 11 [label="Enter when"]; subgraph cluster_5 { color=blue - 11 [label="Enter when branch condition "]; + 13 [label="Enter when branch condition "]; subgraph cluster_6 { color=blue - 12 [label="Enter when"]; - 13 [label="Access variable R|/a|"]; - 14 [label="Type operator: (R|/a| as? R|A|)"]; - 15 [label="Variable declaration: lval : R|A?|"]; + 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 - 16 [label="Enter when branch condition "]; - 17 [label="Const: Null(null)"]; - 18 [label="Operator =="]; - 19 [label="Exit when branch condition"]; + 19 [label="Enter when branch condition "]; + 20 [label="Const: Null(null)"]; + 21 [label="Operator =="]; + 22 [label="Exit when branch condition"]; } subgraph cluster_8 { color=blue - 20 [label="Enter when branch condition else"]; - 21 [label="Exit when branch condition"]; + 29 [label="Enter when branch condition else"]; + 30 [label="Exit when branch condition"]; } - 22 [label="Enter when branch result"]; + 31 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 23 [label="Enter block"]; - 24 [label="Access variable R|/|"]; - 25 [label="Exit block"]; + 32 [label="Enter block"]; + 33 [label="Access variable R|/|"]; + 34 [label="Exit block"]; } - 26 [label="Exit when branch result"]; - 27 [label="Enter when branch result"]; + 35 [label="Exit when branch result"]; + 23 [label="Enter when branch result"]; subgraph cluster_10 { color=blue - 28 [label="Enter block"]; - 29 [label="Jump: ^test Unit"]; - 30 [label="Stub" style="filled" fillcolor=gray]; - 31 [label="Exit block" style="filled" fillcolor=gray]; + 24 [label="Enter block"]; + 25 [label="Jump: ^test Unit"]; + 26 [label="Stub" style="filled" fillcolor=gray]; + 27 [label="Exit block" style="filled" fillcolor=gray]; } - 32 [label="Exit when branch result" style="filled" fillcolor=gray]; - 33 [label="Exit when"]; + 28 [label="Exit when branch result" style="filled" fillcolor=gray]; + 15 [label="Exit when"]; } - 34 [label="Function call: R|/takeA|(...)"]; - 35 [label="Exit when branch condition"]; + 36 [label="Function call: R|/takeA|(...)"]; + 37 [label="Exit when branch condition"]; } - 36 [label="Synthetic else branch"]; - 37 [label="Enter when branch result"]; + 44 [label="Synthetic else branch"]; + 38 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 38 [label="Enter block"]; - 39 [label="Access variable R|/a|"]; - 40 [label="Function call: R|/a|.R|/A.foo|()"]; - 41 [label="Exit block"]; + 39 [label="Enter block"]; + 40 [label="Access variable R|/a|"]; + 41 [label="Function call: R|/a|.R|/A.foo|()"]; + 42 [label="Exit block"]; } - 42 [label="Exit when branch result"]; - 43 [label="Exit when"]; + 43 [label="Exit when branch result"]; + 12 [label="Exit when"]; } - 44 [label="Exit function test" style="filled" fillcolor=red]; + 10 [label="Exit function test" style="filled" fillcolor=red]; } - - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {13}; + 9 -> {11}; + 11 -> {13}; + 12 -> {10}; 13 -> {14}; - 14 -> {15}; - 15 -> {16}; + 14 -> {16}; + 15 -> {36}; 16 -> {17}; 17 -> {18}; 18 -> {19}; - 19 -> {27 20}; + 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {23}; + 22 -> {23 29}; 23 -> {24}; 24 -> {25}; - 25 -> {26}; - 26 -> {33}; - 27 -> {28}; - 28 -> {29}; - 29 -> {44}; - 29 -> {30} [style=dotted]; - 30 -> {31} [style=dotted]; - 31 -> {32} [style=dotted]; - 32 -> {33} [style=dotted]; + 25 -> {10}; + 25 -> {26} [style=dotted]; + 26 -> {27} [style=dotted]; + 27 -> {28} [style=dotted]; + 28 -> {15} [style=dotted]; + 29 -> {30}; + 30 -> {31}; + 31 -> {32}; + 32 -> {33}; 33 -> {34}; 34 -> {35}; - 35 -> {37 36}; - 36 -> {43}; - 37 -> {38}; + 35 -> {15}; + 36 -> {37}; + 37 -> {38 44}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; - 43 -> {44}; + 43 -> {12}; + 44 -> {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 deff5680b94..755b0ee9a37 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot @@ -8,7 +8,6 @@ digraph when_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph when_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph when_kt { 4 [label="Enter function bar" style="filled" fillcolor=red]; 5 [label="Exit function bar" style="filled" fillcolor=red]; } - 4 -> {5}; subgraph cluster_3 { @@ -32,7 +29,6 @@ digraph when_kt { 6 [label="Enter class B" style="filled" fillcolor=red]; 7 [label="Exit class B" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; subgraph cluster_4 { @@ -40,165 +36,163 @@ digraph when_kt { 8 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 9 [label="Enter when"]; + 10 [label="Enter when"]; subgraph cluster_6 { color=blue - 10 [label="Enter when branch condition "]; - 11 [label="Access variable R|/x|"]; - 12 [label="Type operator: (R|/x| is R|A|)"]; - 13 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_7 { color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Access variable R|/x|"]; - 16 [label="Type operator: (R|/x| is R|B|)"]; - 17 [label="Exit when branch condition"]; + 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"]; } - 18 [label="Synthetic else branch"]; - 19 [label="Enter when branch result"]; + 32 [label="Synthetic else branch"]; + 26 [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|/B.bar|()"]; - 23 [label="Exit block"]; + 27 [label="Enter block"]; + 28 [label="Access variable R|/x|"]; + 29 [label="Function call: R|/x|.R|/B.bar|()"]; + 30 [label="Exit block"]; } - 24 [label="Exit when branch result"]; - 25 [label="Enter when branch result"]; + 31 [label="Exit when branch result"]; + 16 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 26 [label="Enter block"]; - 27 [label="Access variable R|/x|"]; - 28 [label="Function call: R|/x|.R|/A.foo|()"]; - 29 [label="Exit block"]; + 17 [label="Enter block"]; + 18 [label="Access variable R|/x|"]; + 19 [label="Function call: R|/x|.R|/A.foo|()"]; + 20 [label="Exit block"]; } - 30 [label="Exit when branch result"]; - 31 [label="Exit when"]; + 21 [label="Exit when branch result"]; + 11 [label="Exit when"]; } subgraph cluster_10 { color=blue - 32 [label="Enter when"]; + 33 [label="Enter when"]; subgraph cluster_11 { color=blue - 33 [label="Enter when branch condition "]; - 34 [label="Access variable R|/x|"]; - 35 [label="Type operator: (R|/x| !is R|A|)"]; - 36 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_12 { color=blue - 37 [label="Enter when branch condition "]; - 38 [label="Access variable R|/x|"]; - 39 [label="Type operator: (R|/x| !is R|B|)"]; - 40 [label="Exit when branch condition"]; + 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 - 41 [label="Enter when branch condition "]; - 42 [label="Access variable R|/x|"]; - 43 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 44 [label="Exit when branch condition"]; + 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 - 45 [label="Enter when branch condition else"]; - 46 [label="Exit when branch condition"]; + 67 [label="Enter when branch condition else"]; + 68 [label="Exit when branch condition"]; } - 47 [label="Enter when branch result"]; + 69 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 48 [label="Enter block"]; - 49 [label="Access variable R|/x|"]; - 50 [label="Function call: R|/x|.R|/A.foo|()"]; - 51 [label="Access variable R|/x|"]; - 52 [label="Function call: R|/x|.R|/B.bar|()"]; - 53 [label="Exit block"]; + 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"]; } - 54 [label="Exit when branch result"]; - 55 [label="Enter when branch result"]; + 76 [label="Exit when branch result"]; + 57 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 56 [label="Enter block"]; - 57 [label="Access variable R|/x|"]; - 58 [label="Function call: R|/x|.R|/A.foo|()"]; + 58 [label="Enter block"]; 59 [label="Access variable R|/x|"]; - 60 [label="Function call: R|/x|.R|/B.bar|()"]; + 60 [label="Function call: R|/x|.R|/A.foo|()"]; 61 [label="Access variable R|/x|"]; - 62 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 63 [label="Exit block"]; + 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"]; } - 64 [label="Exit when branch result"]; - 65 [label="Enter when branch result"]; + 66 [label="Exit when branch result"]; + 47 [label="Enter when branch result"]; subgraph cluster_17 { color=blue - 66 [label="Enter block"]; - 67 [label="Access variable R|/x|"]; - 68 [label="Function call: R|/x|.R|/A.foo|()"]; - 69 [label="Exit block"]; + 48 [label="Enter block"]; + 49 [label="Access variable R|/x|"]; + 50 [label="Function call: R|/x|.R|/A.foo|()"]; + 51 [label="Exit block"]; } - 70 [label="Exit when branch result"]; - 71 [label="Enter when branch result"]; + 52 [label="Exit when branch result"]; + 39 [label="Enter when branch result"]; subgraph cluster_18 { color=blue - 72 [label="Enter block"]; - 73 [label="Exit block"]; + 40 [label="Enter block"]; + 41 [label="Exit block"]; } - 74 [label="Exit when branch result"]; - 75 [label="Exit when"]; + 42 [label="Exit when branch result"]; + 34 [label="Exit when"]; } - 76 [label="Exit function test_1" style="filled" fillcolor=red]; + 9 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; + 8 -> {10}; + 10 -> {12}; + 11 -> {33}; 12 -> {13}; - 13 -> {25 14}; + 13 -> {14}; 14 -> {15}; - 15 -> {16}; + 15 -> {16 22}; 16 -> {17}; - 17 -> {19 18}; - 18 -> {31}; + 17 -> {18}; + 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {22}; + 21 -> {11}; 22 -> {23}; 23 -> {24}; - 24 -> {31}; - 25 -> {26}; + 24 -> {25}; + 25 -> {26 32}; 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {35}; + 31 -> {11}; + 32 -> {11}; + 33 -> {35}; + 34 -> {9}; 35 -> {36}; - 36 -> {71 37}; + 36 -> {37}; 37 -> {38}; - 38 -> {39}; + 38 -> {39 43}; 39 -> {40}; - 40 -> {65 41}; + 40 -> {41}; 41 -> {42}; - 42 -> {43}; + 42 -> {34}; 43 -> {44}; - 44 -> {55 45}; + 44 -> {45}; 45 -> {46}; - 46 -> {47}; + 46 -> {47 53}; 47 -> {48}; 48 -> {49}; 49 -> {50}; 50 -> {51}; 51 -> {52}; - 52 -> {53}; + 52 -> {34}; 53 -> {54}; - 54 -> {75}; + 54 -> {55}; 55 -> {56}; - 56 -> {57}; + 56 -> {57 67}; 57 -> {58}; 58 -> {59}; 59 -> {60}; @@ -206,177 +200,176 @@ digraph when_kt { 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {75}; + 64 -> {65}; 65 -> {66}; - 66 -> {67}; + 66 -> {34}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {75}; + 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; 75 -> {76}; + 76 -> {34}; subgraph cluster_19 { color=red 77 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_20 { color=blue - 78 [label="Enter when"]; - 79 [label="Access variable R|/x|"]; + 79 [label="Enter when"]; + 81 [label="Access variable R|/x|"]; subgraph cluster_21 { color=blue - 80 [label="Enter when branch condition "]; - 81 [label="Type operator: ($subj$ is R|A|)"]; - 82 [label="Exit when branch condition"]; + 82 [label="Enter when branch condition "]; + 83 [label="Type operator: ($subj$ is R|A|)"]; + 84 [label="Exit when branch condition"]; } subgraph cluster_22 { color=blue - 83 [label="Enter when branch condition "]; - 84 [label="Type operator: ($subj$ is R|B|)"]; - 85 [label="Exit when branch condition"]; + 91 [label="Enter when branch condition "]; + 92 [label="Type operator: ($subj$ is R|B|)"]; + 93 [label="Exit when branch condition"]; } - 86 [label="Synthetic else branch"]; - 87 [label="Enter when branch result"]; + 100 [label="Synthetic else branch"]; + 94 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 88 [label="Enter block"]; - 89 [label="Access variable R|/x|"]; - 90 [label="Function call: R|/x|.R|/B.bar|()"]; - 91 [label="Exit block"]; + 95 [label="Enter block"]; + 96 [label="Access variable R|/x|"]; + 97 [label="Function call: R|/x|.R|/B.bar|()"]; + 98 [label="Exit block"]; } - 92 [label="Exit when branch result"]; - 93 [label="Enter when branch result"]; + 99 [label="Exit when branch result"]; + 85 [label="Enter when branch result"]; subgraph cluster_24 { color=blue - 94 [label="Enter block"]; - 95 [label="Access variable R|/x|"]; - 96 [label="Function call: R|/x|.R|/A.foo|()"]; - 97 [label="Exit block"]; + 86 [label="Enter block"]; + 87 [label="Access variable R|/x|"]; + 88 [label="Function call: R|/x|.R|/A.foo|()"]; + 89 [label="Exit block"]; } - 98 [label="Exit when branch result"]; - 99 [label="Exit when"]; + 90 [label="Exit when branch result"]; + 80 [label="Exit when"]; } subgraph cluster_25 { color=blue - 100 [label="Enter when"]; - 101 [label="Access variable R|/x|"]; + 101 [label="Enter when"]; + 103 [label="Access variable R|/x|"]; subgraph cluster_26 { color=blue - 102 [label="Enter when branch condition "]; - 103 [label="Type operator: ($subj$ !is R|A|)"]; - 104 [label="Exit when branch condition"]; + 104 [label="Enter when branch condition "]; + 105 [label="Type operator: ($subj$ !is R|A|)"]; + 106 [label="Exit when branch condition"]; } subgraph cluster_27 { color=blue - 105 [label="Enter when branch condition "]; - 106 [label="Type operator: ($subj$ !is R|B|)"]; - 107 [label="Exit when branch condition"]; + 111 [label="Enter when branch condition "]; + 112 [label="Type operator: ($subj$ !is R|B|)"]; + 113 [label="Exit when branch condition"]; } subgraph cluster_28 { color=blue - 108 [label="Enter when branch condition "]; - 109 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; - 110 [label="Exit when branch condition"]; + 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 - 111 [label="Enter when branch condition else"]; - 112 [label="Exit when branch condition"]; + 133 [label="Enter when branch condition else"]; + 134 [label="Exit when branch condition"]; } - 113 [label="Enter when branch result"]; + 135 [label="Enter when branch result"]; subgraph cluster_30 { color=blue - 114 [label="Enter block"]; - 115 [label="Access variable R|/x|"]; - 116 [label="Function call: R|/x|.R|/A.foo|()"]; - 117 [label="Access variable R|/x|"]; - 118 [label="Function call: R|/x|.R|/B.bar|()"]; - 119 [label="Exit block"]; + 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"]; } - 120 [label="Exit when branch result"]; - 121 [label="Enter when branch result"]; + 142 [label="Exit when branch result"]; + 123 [label="Enter when branch result"]; subgraph cluster_31 { color=blue - 122 [label="Enter block"]; - 123 [label="Access variable R|/x|"]; - 124 [label="Function call: R|/x|.R|/A.foo|()"]; + 124 [label="Enter block"]; 125 [label="Access variable R|/x|"]; - 126 [label="Function call: R|/x|.R|/B.bar|()"]; + 126 [label="Function call: R|/x|.R|/A.foo|()"]; 127 [label="Access variable R|/x|"]; - 128 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 129 [label="Exit block"]; + 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"]; } - 130 [label="Exit when branch result"]; - 131 [label="Enter when branch result"]; + 132 [label="Exit when branch result"]; + 114 [label="Enter when branch result"]; subgraph cluster_32 { color=blue - 132 [label="Enter block"]; - 133 [label="Access variable R|/x|"]; - 134 [label="Function call: R|/x|.R|/A.foo|()"]; - 135 [label="Exit block"]; + 115 [label="Enter block"]; + 116 [label="Access variable R|/x|"]; + 117 [label="Function call: R|/x|.R|/A.foo|()"]; + 118 [label="Exit block"]; } - 136 [label="Exit when branch result"]; - 137 [label="Enter when branch result"]; + 119 [label="Exit when branch result"]; + 107 [label="Enter when branch result"]; subgraph cluster_33 { color=blue - 138 [label="Enter block"]; - 139 [label="Exit block"]; + 108 [label="Enter block"]; + 109 [label="Exit block"]; } - 140 [label="Exit when branch result"]; - 141 [label="Exit when"]; + 110 [label="Exit when branch result"]; + 102 [label="Exit when"]; } - 142 [label="Exit function test_2" style="filled" fillcolor=red]; + 78 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 77 -> {78}; - 78 -> {79}; - 79 -> {80}; - 80 -> {81}; + 77 -> {79}; + 79 -> {81}; + 80 -> {101}; 81 -> {82}; - 82 -> {93 83}; + 82 -> {83}; 83 -> {84}; - 84 -> {85}; - 85 -> {87 86}; - 86 -> {99}; + 84 -> {85 91}; + 85 -> {86}; + 86 -> {87}; 87 -> {88}; 88 -> {89}; 89 -> {90}; - 90 -> {91}; + 90 -> {80}; 91 -> {92}; - 92 -> {99}; - 93 -> {94}; + 92 -> {93}; + 93 -> {94 100}; 94 -> {95}; 95 -> {96}; 96 -> {97}; 97 -> {98}; 98 -> {99}; - 99 -> {100}; - 100 -> {101}; - 101 -> {102}; - 102 -> {103}; + 99 -> {80}; + 100 -> {80}; + 101 -> {103}; + 102 -> {78}; 103 -> {104}; - 104 -> {137 105}; + 104 -> {105}; 105 -> {106}; - 106 -> {107}; - 107 -> {131 108}; + 106 -> {107 111}; + 107 -> {108}; 108 -> {109}; 109 -> {110}; - 110 -> {121 111}; + 110 -> {102}; 111 -> {112}; 112 -> {113}; - 113 -> {114}; + 113 -> {114 120}; 114 -> {115}; 115 -> {116}; 116 -> {117}; 117 -> {118}; 118 -> {119}; - 119 -> {120}; - 120 -> {141}; + 119 -> {102}; + 120 -> {121}; 121 -> {122}; - 122 -> {123}; + 122 -> {123 133}; 123 -> {124}; 124 -> {125}; 125 -> {126}; @@ -384,107 +377,108 @@ digraph when_kt { 127 -> {128}; 128 -> {129}; 129 -> {130}; - 130 -> {141}; + 130 -> {131}; 131 -> {132}; - 132 -> {133}; + 132 -> {102}; 133 -> {134}; 134 -> {135}; 135 -> {136}; - 136 -> {141}; + 136 -> {137}; 137 -> {138}; 138 -> {139}; 139 -> {140}; 140 -> {141}; 141 -> {142}; + 142 -> {102}; subgraph cluster_34 { color=red 143 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_35 { color=blue - 144 [label="Enter when"]; - 145 [label="Access variable R|/x|"]; - 146 [label="Variable declaration: lval y: R|kotlin/Any?|"]; + 145 [label="Enter when"]; + 147 [label="Access variable R|/x|"]; + 148 [label="Variable declaration: lval y: R|kotlin/Any?|"]; subgraph cluster_36 { color=blue - 147 [label="Enter when branch condition "]; - 148 [label="Type operator: ($subj$ is R|A|)"]; - 149 [label="Exit when branch condition"]; + 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 - 150 [label="Enter when branch condition "]; - 151 [label="Type operator: ($subj$ is R|B|)"]; - 152 [label="Exit when branch condition"]; + 160 [label="Enter when branch condition "]; + 161 [label="Type operator: ($subj$ is R|B|)"]; + 162 [label="Exit when branch condition"]; } - 153 [label="Synthetic else branch"]; - 154 [label="Enter when branch result"]; + 171 [label="Synthetic else branch"]; + 163 [label="Enter when branch result"]; subgraph cluster_38 { color=blue - 155 [label="Enter block"]; - 156 [label="Access variable R|/x|"]; - 157 [label="Function call: R|/x|.R|/B.bar|()"]; - 158 [label="Access variable R|/y|"]; - 159 [label="Function call: R|/y|.R|/B.bar|()"]; - 160 [label="Exit block"]; + 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"]; } - 161 [label="Exit when branch result"]; - 162 [label="Enter when branch result"]; + 170 [label="Exit when branch result"]; + 152 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 163 [label="Enter block"]; - 164 [label="Access variable R|/x|"]; - 165 [label="Function call: R|/x|.R|/A.foo|()"]; - 166 [label="Access variable R|/y|"]; - 167 [label="Function call: R|/y|.R|/A.foo|()"]; - 168 [label="Exit block"]; + 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"]; } - 169 [label="Exit when branch result"]; - 170 [label="Exit when"]; + 159 [label="Exit when branch result"]; + 146 [label="Exit when"]; } subgraph cluster_40 { color=blue - 171 [label="Enter when"]; - 172 [label="Access variable R|/x|"]; - 173 [label="Variable declaration: lval y: R|kotlin/Any?|"]; + 172 [label="Enter when"]; + 174 [label="Access variable R|/x|"]; + 175 [label="Variable declaration: lval y: R|kotlin/Any?|"]; subgraph cluster_41 { color=blue - 174 [label="Enter when branch condition "]; - 175 [label="Type operator: ($subj$ !is R|A|)"]; - 176 [label="Exit when branch condition"]; + 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 - 177 [label="Enter when branch condition "]; - 178 [label="Type operator: ($subj$ !is R|B|)"]; - 179 [label="Exit when branch condition"]; + 183 [label="Enter when branch condition "]; + 184 [label="Type operator: ($subj$ !is R|B|)"]; + 185 [label="Exit when branch condition"]; } subgraph cluster_43 { color=blue - 180 [label="Enter when branch condition "]; - 181 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; - 182 [label="Exit when branch condition"]; + 194 [label="Enter when branch condition "]; + 195 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; + 196 [label="Exit when branch condition"]; } subgraph cluster_44 { color=blue - 183 [label="Enter when branch condition else"]; - 184 [label="Exit when branch condition"]; + 213 [label="Enter when branch condition else"]; + 214 [label="Exit when branch condition"]; } - 185 [label="Enter when branch result"]; + 215 [label="Enter when branch result"]; subgraph cluster_45 { color=blue - 186 [label="Enter block"]; - 187 [label="Access variable R|/x|"]; - 188 [label="Function call: R|/x|.R|/A.foo|()"]; - 189 [label="Access variable R|/x|"]; - 190 [label="Function call: R|/x|.R|/B.bar|()"]; - 191 [label="Access variable R|/y|"]; - 192 [label="Function call: R|/y|.R|/A.foo|()"]; - 193 [label="Access variable R|/y|"]; - 194 [label="Function call: R|/y|.R|/B.bar|()"]; - 195 [label="Exit block"]; - } - 196 [label="Exit when branch result"]; + 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 @@ -504,49 +498,47 @@ digraph when_kt { 211 [label="Exit block"]; } 212 [label="Exit when branch result"]; - 213 [label="Enter when branch result"]; + 186 [label="Enter when branch result"]; subgraph cluster_47 { color=blue - 214 [label="Enter block"]; - 215 [label="Access variable R|/x|"]; - 216 [label="Function call: R|/x|.R|/A.foo|()"]; - 217 [label="Access variable R|/y|"]; - 218 [label="Function call: R|/y|.R|/A.foo|()"]; - 219 [label="Exit block"]; + 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"]; } - 220 [label="Exit when branch result"]; - 221 [label="Enter when branch result"]; + 193 [label="Exit when branch result"]; + 179 [label="Enter when branch result"]; subgraph cluster_48 { color=blue - 222 [label="Enter block"]; - 223 [label="Exit block"]; + 180 [label="Enter block"]; + 181 [label="Exit block"]; } - 224 [label="Exit when branch result"]; - 225 [label="Exit when"]; + 182 [label="Exit when branch result"]; + 173 [label="Exit when"]; } - 226 [label="Exit function test_3" style="filled" fillcolor=red]; + 144 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 143 -> {144}; - 144 -> {145}; - 145 -> {146}; - 146 -> {147}; + 143 -> {145}; + 145 -> {147}; + 146 -> {172}; 147 -> {148}; 148 -> {149}; - 149 -> {162 150}; + 149 -> {150}; 150 -> {151}; - 151 -> {152}; - 152 -> {154 153}; - 153 -> {170}; + 151 -> {152 160}; + 152 -> {153}; + 153 -> {154}; 154 -> {155}; 155 -> {156}; 156 -> {157}; 157 -> {158}; 158 -> {159}; - 159 -> {160}; + 159 -> {146}; 160 -> {161}; - 161 -> {170}; - 162 -> {163}; + 161 -> {162}; + 162 -> {163 171}; 163 -> {164}; 164 -> {165}; 165 -> {166}; @@ -554,22 +546,22 @@ digraph when_kt { 167 -> {168}; 168 -> {169}; 169 -> {170}; - 170 -> {171}; - 171 -> {172}; - 172 -> {173}; - 173 -> {174}; + 170 -> {146}; + 171 -> {146}; + 172 -> {174}; + 173 -> {144}; 174 -> {175}; 175 -> {176}; - 176 -> {221 177}; + 176 -> {177}; 177 -> {178}; - 178 -> {179}; - 179 -> {213 180}; + 178 -> {179 183}; + 179 -> {180}; 180 -> {181}; 181 -> {182}; - 182 -> {197 183}; + 182 -> {173}; 183 -> {184}; 184 -> {185}; - 185 -> {186}; + 185 -> {186 194}; 186 -> {187}; 187 -> {188}; 188 -> {189}; @@ -577,10 +569,10 @@ digraph when_kt { 190 -> {191}; 191 -> {192}; 192 -> {193}; - 193 -> {194}; + 193 -> {173}; 194 -> {195}; 195 -> {196}; - 196 -> {225}; + 196 -> {197 213}; 197 -> {198}; 198 -> {199}; 199 -> {200}; @@ -596,7 +588,7 @@ digraph when_kt { 209 -> {210}; 210 -> {211}; 211 -> {212}; - 212 -> {225}; + 212 -> {173}; 213 -> {214}; 214 -> {215}; 215 -> {216}; @@ -604,62 +596,62 @@ digraph when_kt { 217 -> {218}; 218 -> {219}; 219 -> {220}; - 220 -> {225}; + 220 -> {221}; 221 -> {222}; 222 -> {223}; 223 -> {224}; 224 -> {225}; 225 -> {226}; + 226 -> {173}; subgraph cluster_49 { color=red 227 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_50 { color=blue - 228 [label="Enter when"]; - 229 [label="Access variable R|/x|"]; - 230 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 229 [label="Enter when"]; + 231 [label="Access variable R|/x|"]; + 232 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; subgraph cluster_51 { color=blue - 231 [label="Enter when branch condition "]; - 232 [label="Const: Int(1)"]; - 233 [label="Operator =="]; - 234 [label="Exit when branch condition"]; + 233 [label="Enter when branch condition "]; + 234 [label="Const: Int(1)"]; + 235 [label="Operator =="]; + 236 [label="Exit when branch condition"]; } - 235 [label="Synthetic else branch"]; - 236 [label="Enter when branch result"]; + 243 [label="Synthetic else branch"]; + 237 [label="Enter when branch result"]; subgraph cluster_52 { color=blue - 237 [label="Enter block"]; - 238 [label="Access variable R|/x|"]; - 239 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 240 [label="Exit block"]; + 238 [label="Enter block"]; + 239 [label="Access variable R|/x|"]; + 240 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 241 [label="Exit block"]; } - 241 [label="Exit when branch result"]; - 242 [label="Exit when"]; + 242 [label="Exit when branch result"]; + 230 [label="Exit when"]; } - 243 [label="Access variable R|/x|"]; - 244 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 245 [label="Exit function test_4" style="filled" fillcolor=red]; + 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]; } - - 227 -> {228}; - 228 -> {229}; - 229 -> {230}; - 230 -> {231}; + 227 -> {229}; + 229 -> {231}; + 230 -> {244}; 231 -> {232}; 232 -> {233}; 233 -> {234}; - 234 -> {236 235}; - 235 -> {242}; - 236 -> {237}; + 234 -> {235}; + 235 -> {236}; + 236 -> {237 243}; 237 -> {238}; 238 -> {239}; 239 -> {240}; 240 -> {241}; 241 -> {242}; - 242 -> {243}; - 243 -> {244}; + 242 -> {230}; + 243 -> {230}; 244 -> {245}; + 245 -> {228}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot index e223c199d05..75dc8077c7b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot @@ -8,7 +8,6 @@ digraph equalsAndIdentity_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph equalsAndIdentity_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,66 +22,64 @@ digraph equalsAndIdentity_kt { 4 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 5 [label="Enter when"]; + 6 [label="Enter when"]; subgraph cluster_4 { color=blue - 6 [label="Enter when branch condition "]; - 7 [label="Access variable R|/x|"]; - 8 [label="Access variable R|/y|"]; - 9 [label="Operator =="]; - 10 [label="Exit when branch condition"]; + 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"]; } - 11 [label="Synthetic else branch"]; - 12 [label="Enter when branch result"]; + 21 [label="Synthetic else branch"]; + 13 [label="Enter when branch result"]; subgraph cluster_5 { color=blue - 13 [label="Enter block"]; - 14 [label="Access variable R|/x|"]; - 15 [label="Function call: R|/x|.R|/A.foo|()"]; - 16 [label="Access variable R|/y|"]; - 17 [label="Function call: R|/y|.R|/A.foo|()"]; - 18 [label="Exit block"]; + 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"]; } - 19 [label="Exit when branch result"]; - 20 [label="Exit when"]; + 20 [label="Exit when branch result"]; + 7 [label="Exit when"]; } subgraph cluster_6 { color=blue - 21 [label="Enter when"]; + 22 [label="Enter when"]; subgraph cluster_7 { color=blue - 22 [label="Enter when branch condition "]; - 23 [label="Access variable R|/x|"]; - 24 [label="Access variable R|/y|"]; - 25 [label="Operator ==="]; - 26 [label="Exit when branch condition"]; + 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"]; } - 27 [label="Synthetic else branch"]; - 28 [label="Enter when branch result"]; + 37 [label="Synthetic else branch"]; + 29 [label="Enter when branch result"]; subgraph cluster_8 { 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|/y|"]; - 33 [label="Function call: R|/y|.R|/A.foo|()"]; - 34 [label="Exit block"]; + 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"]; } - 35 [label="Exit when branch result"]; - 36 [label="Exit when"]; + 36 [label="Exit when branch result"]; + 23 [label="Exit when"]; } - 37 [label="Exit function test_1" style="filled" fillcolor=red]; + 5 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; + 4 -> {6}; + 6 -> {8}; + 7 -> {22}; 8 -> {9}; 9 -> {10}; - 10 -> {12 11}; - 11 -> {20}; - 12 -> {13}; + 10 -> {11}; + 11 -> {12}; + 12 -> {13 21}; 13 -> {14}; 14 -> {15}; 15 -> {16}; @@ -91,15 +87,15 @@ digraph equalsAndIdentity_kt { 17 -> {18}; 18 -> {19}; 19 -> {20}; - 20 -> {21}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; + 20 -> {7}; + 21 -> {7}; + 22 -> {24}; + 23 -> {5}; 24 -> {25}; 25 -> {26}; - 26 -> {28 27}; - 27 -> {36}; - 28 -> {29}; + 26 -> {27}; + 27 -> {28}; + 28 -> {29 37}; 29 -> {30}; 30 -> {31}; 31 -> {32}; @@ -107,73 +103,72 @@ digraph equalsAndIdentity_kt { 33 -> {34}; 34 -> {35}; 35 -> {36}; - 36 -> {37}; + 36 -> {23}; + 37 -> {23}; subgraph cluster_9 { color=red 38 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_10 { color=blue - 39 [label="Enter when"]; + 40 [label="Enter when"]; subgraph cluster_11 { color=blue - 40 [label="Enter when branch condition "]; - 41 [label="Access variable R|/x|"]; - 42 [label="Access variable R|/y|"]; - 43 [label="Operator =="]; - 44 [label="Exit when branch condition"]; + 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"]; } - 45 [label="Synthetic else branch"]; - 46 [label="Enter when branch result"]; + 55 [label="Synthetic else branch"]; + 47 [label="Enter when branch result"]; subgraph cluster_12 { color=blue - 47 [label="Enter block"]; - 48 [label="Access variable R|/x|"]; - 49 [label="Function call: R|/x|.#()"]; - 50 [label="Access variable R|/y|"]; - 51 [label="Function call: R|/y|.#()"]; - 52 [label="Exit block"]; + 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"]; } - 53 [label="Exit when branch result"]; - 54 [label="Exit when"]; + 54 [label="Exit when branch result"]; + 41 [label="Exit when"]; } subgraph cluster_13 { color=blue - 55 [label="Enter when"]; + 56 [label="Enter when"]; subgraph cluster_14 { color=blue - 56 [label="Enter when branch condition "]; - 57 [label="Access variable R|/x|"]; - 58 [label="Access variable R|/y|"]; - 59 [label="Operator ==="]; - 60 [label="Exit when branch condition"]; + 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"]; } - 61 [label="Synthetic else branch"]; - 62 [label="Enter when branch result"]; + 71 [label="Synthetic else branch"]; + 63 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 63 [label="Enter block"]; - 64 [label="Access variable R|/x|"]; - 65 [label="Function call: R|/x|.#()"]; - 66 [label="Access variable R|/y|"]; - 67 [label="Function call: R|/y|.#()"]; - 68 [label="Exit block"]; + 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"]; } - 69 [label="Exit when branch result"]; - 70 [label="Exit when"]; + 70 [label="Exit when branch result"]; + 57 [label="Exit when"]; } - 71 [label="Exit function test_2" style="filled" fillcolor=red]; + 39 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 38 -> {39}; - 39 -> {40}; - 40 -> {41}; - 41 -> {42}; + 38 -> {40}; + 40 -> {42}; + 41 -> {56}; 42 -> {43}; 43 -> {44}; - 44 -> {46 45}; - 45 -> {54}; - 46 -> {47}; + 44 -> {45}; + 45 -> {46}; + 46 -> {47 55}; 47 -> {48}; 48 -> {49}; 49 -> {50}; @@ -181,15 +176,15 @@ digraph equalsAndIdentity_kt { 51 -> {52}; 52 -> {53}; 53 -> {54}; - 54 -> {55}; - 55 -> {56}; - 56 -> {57}; - 57 -> {58}; + 54 -> {41}; + 55 -> {41}; + 56 -> {58}; + 57 -> {39}; 58 -> {59}; 59 -> {60}; - 60 -> {62 61}; - 61 -> {70}; - 62 -> {63}; + 60 -> {61}; + 61 -> {62}; + 62 -> {63 71}; 63 -> {64}; 64 -> {65}; 65 -> {66}; @@ -197,111 +192,110 @@ digraph equalsAndIdentity_kt { 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {71}; + 70 -> {57}; + 71 -> {57}; subgraph cluster_16 { color=red 72 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_17 { color=blue - 73 [label="Enter when"]; + 74 [label="Enter when"]; subgraph cluster_18 { color=blue - 74 [label="Enter when branch condition "]; - 75 [label="Access variable R|/y|"]; - 76 [label="Const: Null(null)"]; - 77 [label="Operator =="]; - 78 [label="Exit when branch condition"]; + 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="Synthetic else branch"]; - 80 [label="Enter when branch result"]; + 87 [label="Synthetic else branch"]; + 81 [label="Enter when branch result"]; subgraph cluster_19 { color=blue - 81 [label="Enter block"]; - 82 [label="Jump: ^test_3 Unit"]; - 83 [label="Stub" style="filled" fillcolor=gray]; - 84 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 85 [label="Exit when branch result" style="filled" fillcolor=gray]; - 86 [label="Exit when"]; + 86 [label="Exit when branch result" style="filled" fillcolor=gray]; + 75 [label="Exit when"]; } subgraph cluster_20 { color=blue - 87 [label="Enter when"]; + 88 [label="Enter when"]; subgraph cluster_21 { color=blue - 88 [label="Enter when branch condition "]; - 89 [label="Access variable R|/x|"]; - 90 [label="Access variable R|/y|"]; - 91 [label="Operator =="]; - 92 [label="Exit when branch condition"]; + 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"]; } - 93 [label="Synthetic else branch"]; - 94 [label="Enter when branch result"]; + 103 [label="Synthetic else branch"]; + 95 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 95 [label="Enter block"]; - 96 [label="Access variable R|/x|"]; - 97 [label="Function call: R|/x|.R|/A.foo|()"]; - 98 [label="Access variable R|/y|"]; - 99 [label="Function call: R|/y|.R|/A.foo|()"]; - 100 [label="Exit block"]; + 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"]; } - 101 [label="Exit when branch result"]; - 102 [label="Exit when"]; + 102 [label="Exit when branch result"]; + 89 [label="Exit when"]; } subgraph cluster_23 { color=blue - 103 [label="Enter when"]; + 104 [label="Enter when"]; subgraph cluster_24 { color=blue - 104 [label="Enter when branch condition "]; - 105 [label="Access variable R|/x|"]; - 106 [label="Access variable R|/y|"]; - 107 [label="Operator ==="]; - 108 [label="Exit when branch condition"]; + 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"]; } - 109 [label="Synthetic else branch"]; - 110 [label="Enter when branch result"]; + 119 [label="Synthetic else branch"]; + 111 [label="Enter when branch result"]; subgraph cluster_25 { color=blue - 111 [label="Enter block"]; - 112 [label="Access variable R|/x|"]; - 113 [label="Function call: R|/x|.R|/A.foo|()"]; - 114 [label="Access variable R|/y|"]; - 115 [label="Function call: R|/y|.R|/A.foo|()"]; - 116 [label="Exit block"]; + 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"]; } - 117 [label="Exit when branch result"]; - 118 [label="Exit when"]; + 118 [label="Exit when branch result"]; + 105 [label="Exit when"]; } - 119 [label="Exit function test_3" style="filled" fillcolor=red]; + 73 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 72 -> {73}; - 73 -> {74}; - 74 -> {75}; - 75 -> {76}; + 72 -> {74}; + 74 -> {76}; + 75 -> {88}; 76 -> {77}; 77 -> {78}; - 78 -> {80 79}; - 79 -> {86}; - 80 -> {81}; + 78 -> {79}; + 79 -> {80}; + 80 -> {81 87}; 81 -> {82}; - 82 -> {119}; - 82 -> {83} [style=dotted]; + 82 -> {83}; + 83 -> {73}; 83 -> {84} [style=dotted]; 84 -> {85} [style=dotted]; 85 -> {86} [style=dotted]; - 86 -> {87}; - 87 -> {88}; - 88 -> {89}; - 89 -> {90}; + 86 -> {75} [style=dotted]; + 87 -> {75}; + 88 -> {90}; + 89 -> {104}; 90 -> {91}; 91 -> {92}; - 92 -> {94 93}; - 93 -> {102}; - 94 -> {95}; + 92 -> {93}; + 93 -> {94}; + 94 -> {95 103}; 95 -> {96}; 96 -> {97}; 97 -> {98}; @@ -309,15 +303,15 @@ digraph equalsAndIdentity_kt { 99 -> {100}; 100 -> {101}; 101 -> {102}; - 102 -> {103}; - 103 -> {104}; - 104 -> {105}; - 105 -> {106}; + 102 -> {89}; + 103 -> {89}; + 104 -> {106}; + 105 -> {73}; 106 -> {107}; 107 -> {108}; - 108 -> {110 109}; - 109 -> {118}; - 110 -> {111}; + 108 -> {109}; + 109 -> {110}; + 110 -> {111 119}; 111 -> {112}; 112 -> {113}; 113 -> {114}; @@ -325,6 +319,7 @@ digraph equalsAndIdentity_kt { 115 -> {116}; 116 -> {117}; 117 -> {118}; - 118 -> {119}; + 118 -> {105}; + 119 -> {105}; } 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 36fd6f4adbd..d42825288a3 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot @@ -8,7 +8,6 @@ digraph inPlaceLambdas_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph inPlaceLambdas_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph inPlaceLambdas_kt { 4 [label="Enter function bar" style="filled" fillcolor=red]; 5 [label="Exit function bar" style="filled" fillcolor=red]; } - 4 -> {5}; subgraph cluster_3 { @@ -32,7 +29,6 @@ digraph inPlaceLambdas_kt { 6 [label="Enter class B" style="filled" fillcolor=red]; 7 [label="Exit class B" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; subgraph cluster_4 { @@ -40,160 +36,157 @@ digraph inPlaceLambdas_kt { 8 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 9 [label="Enter when"]; + 10 [label="Enter when"]; subgraph cluster_6 { color=blue - 10 [label="Enter when branch condition "]; - 11 [label="Access variable R|/x|"]; - 12 [label="Type operator: (R|/x| is R|A|)"]; - 13 [label="Exit when branch condition"]; + 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"]; } - 14 [label="Synthetic else branch"]; - 15 [label="Enter when branch result"]; + 28 [label="Synthetic else branch"]; + 16 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 16 [label="Enter block"]; - 17 [label="Postponed enter to lambda"]; + 17 [label="Enter block"]; + 18 [label="Postponed enter to lambda"]; subgraph cluster_8 { color=blue - 18 [label="Enter function anonymousFunction"]; - 19 [label="Access variable R|/x|"]; - 20 [label="Function call: R|/x|.R|/A.foo|()"]; + 20 [label="Enter function anonymousFunction"]; + 22 [label="Access variable R|/x|"]; + 23 [label="Function call: R|/x|.R|/A.foo|()"]; 21 [label="Exit function anonymousFunction"]; } - 22 [label="Call arguments union" style="filled" fillcolor=yellow]; - 23 [label="Postponed exit from lambda"]; + 25 [label="Call arguments union" style="filled" fillcolor=yellow]; + 19 [label="Postponed exit from lambda"]; 24 [label="Function call: R|kotlin/run|(...)"]; - 25 [label="Exit block"]; + 26 [label="Exit block"]; } - 26 [label="Exit when branch result"]; - 27 [label="Exit when"]; + 27 [label="Exit when branch result"]; + 11 [label="Exit when"]; } - 28 [label="Exit function test_1" style="filled" fillcolor=red]; + 9 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; + 8 -> {10}; + 10 -> {12}; + 11 -> {9}; 12 -> {13}; - 13 -> {15 14}; - 14 -> {27}; - 15 -> {16}; + 13 -> {14}; + 14 -> {15}; + 15 -> {16 28}; 16 -> {17}; 17 -> {18}; - 17 -> {23} [color=red]; - 18 -> {19}; - 19 -> {20}; - 20 -> {21}; - 21 -> {23} [color=green]; - 21 -> {22} [color=red]; - 22 -> {24} [color=red]; - 23 -> {24} [color=green]; - 24 -> {25}; - 25 -> {26}; + 18 -> {20}; + 18 -> {19} [color=red]; + 19 -> {24} [color=green]; + 20 -> {22}; + 21 -> {19} [color=green]; + 21 -> {25} [color=red]; + 22 -> {23}; + 23 -> {21}; + 24 -> {26}; + 25 -> {24} [color=red]; 26 -> {27}; - 27 -> {28}; + 27 -> {11}; + 28 -> {11}; subgraph cluster_9 { color=red 29 [label="Enter function test_2" style="filled" fillcolor=red]; - 30 [label="Postponed enter to lambda"]; + 31 [label="Postponed enter to lambda"]; subgraph cluster_10 { color=blue - 31 [label="Enter function anonymousFunction"]; - 32 [label="Access variable R|/x|"]; - 33 [label="Type operator: (R|/x| as R|B|)"]; + 33 [label="Enter function anonymousFunction"]; + 35 [label="Access variable R|/x|"]; + 36 [label="Type operator: (R|/x| as R|B|)"]; 34 [label="Exit function anonymousFunction"]; } - 35 [label="Call arguments union" style="filled" fillcolor=yellow]; - 36 [label="Postponed exit from lambda"]; + 38 [label="Call arguments union" style="filled" fillcolor=yellow]; + 32 [label="Postponed exit from lambda"]; 37 [label="Function call: R|kotlin/run|(...)"]; - 38 [label="Access variable R|/x|"]; - 39 [label="Function call: R|/x|.R|/B.bar|()"]; - 40 [label="Exit function test_2" style="filled" fillcolor=red]; + 39 [label="Access variable R|/x|"]; + 40 [label="Function call: R|/x|.R|/B.bar|()"]; + 30 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 29 -> {30}; - 30 -> {31}; - 30 -> {36} [color=red]; - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {36} [color=green]; - 34 -> {35} [color=red]; - 35 -> {37} [color=red]; - 36 -> {37} [color=green]; - 37 -> {38}; - 38 -> {39}; + 29 -> {31}; + 31 -> {33}; + 31 -> {32} [color=red]; + 32 -> {37} [color=green]; + 33 -> {35}; + 34 -> {32} [color=green]; + 34 -> {38} [color=red]; + 35 -> {36}; + 36 -> {34}; + 37 -> {39}; + 38 -> {37} [color=red]; 39 -> {40}; + 40 -> {30}; subgraph cluster_11 { color=red 41 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_12 { color=blue - 42 [label="Enter when"]; + 43 [label="Enter when"]; subgraph cluster_13 { color=blue - 43 [label="Enter when branch condition "]; - 44 [label="Access variable R|/x|"]; - 45 [label="Type operator: (R|/x| is R|A|)"]; - 46 [label="Exit when branch condition"]; + 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"]; } - 47 [label="Synthetic else branch"]; - 48 [label="Enter when branch result"]; + 65 [label="Synthetic else branch"]; + 49 [label="Enter when branch result"]; subgraph cluster_14 { color=blue - 49 [label="Enter block"]; - 50 [label="Postponed enter to lambda"]; + 50 [label="Enter block"]; + 51 [label="Postponed enter to lambda"]; subgraph cluster_15 { color=blue - 51 [label="Enter function anonymousFunction"]; - 52 [label="Access variable R|/x|"]; - 53 [label="Function call: R|/x|.R|/A.foo|()"]; - 54 [label="Access variable R|/x|"]; - 55 [label="Type operator: (R|/x| as R|B|)"]; - 56 [label="Exit function anonymousFunction"]; + 53 [label="Enter function anonymousFunction"]; + 55 [label="Access variable R|/x|"]; + 56 [label="Function call: R|/x|.R|/A.foo|()"]; + 57 [label="Access variable R|/x|"]; + 58 [label="Type operator: (R|/x| as R|B|)"]; + 54 [label="Exit function anonymousFunction"]; } - 57 [label="Call arguments union" style="filled" fillcolor=yellow]; - 58 [label="Postponed exit from lambda"]; + 60 [label="Call arguments union" style="filled" fillcolor=yellow]; + 52 [label="Postponed exit from lambda"]; 59 [label="Function call: R|kotlin/run|(...)"]; - 60 [label="Access variable R|/x|"]; - 61 [label="Function call: R|/x|.R|/B.bar|()"]; - 62 [label="Exit block"]; + 61 [label="Access variable R|/x|"]; + 62 [label="Function call: R|/x|.R|/B.bar|()"]; + 63 [label="Exit block"]; } - 63 [label="Exit when branch result"]; - 64 [label="Exit when"]; + 64 [label="Exit when branch result"]; + 44 [label="Exit when"]; } - 65 [label="Exit function test_3" style="filled" fillcolor=red]; + 42 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 41 -> {42}; - 42 -> {43}; - 43 -> {44}; - 44 -> {45}; + 41 -> {43}; + 43 -> {45}; + 44 -> {42}; 45 -> {46}; - 46 -> {48 47}; - 47 -> {64}; - 48 -> {49}; + 46 -> {47}; + 47 -> {48}; + 48 -> {49 65}; 49 -> {50}; 50 -> {51}; - 50 -> {58} [color=red]; - 51 -> {52}; - 52 -> {53}; - 53 -> {54}; - 54 -> {55}; + 51 -> {53}; + 51 -> {52} [color=red]; + 52 -> {59} [color=green]; + 53 -> {55}; + 54 -> {52} [color=green]; + 54 -> {60} [color=red]; 55 -> {56}; - 56 -> {58} [color=green]; - 56 -> {57} [color=red]; - 57 -> {59} [color=red]; - 58 -> {59} [color=green]; - 59 -> {60}; - 60 -> {61}; + 56 -> {57}; + 57 -> {58}; + 58 -> {54}; + 59 -> {61}; + 60 -> {59} [color=red]; 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {65}; + 64 -> {44}; + 65 -> {44}; } 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 f3c0104beb6..d17f2109ec7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/smartcastOnLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/smartcastOnLambda.dot @@ -8,42 +8,41 @@ digraph smartcastOnLambda_kt { 0 [label="Enter function test" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; + 2 [label="Enter when"]; subgraph cluster_2 { color=blue - 2 [label="Enter when branch condition "]; - 3 [label="Access variable R|/func|"]; - 4 [label="Const: Null(null)"]; - 5 [label="Operator !="]; - 6 [label="Exit when branch condition"]; + 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"]; } - 7 [label="Synthetic else branch"]; - 8 [label="Enter when branch result"]; + 14 [label="Synthetic else branch"]; + 9 [label="Enter when branch result"]; subgraph cluster_3 { color=blue - 9 [label="Enter block"]; - 10 [label="Function call: R|/func|.R|FakeOverride|()"]; - 11 [label="Exit block"]; + 10 [label="Enter block"]; + 11 [label="Function call: R|/func|.R|FakeOverride|()"]; + 12 [label="Exit block"]; } - 12 [label="Exit when branch result"]; - 13 [label="Exit when"]; + 13 [label="Exit when branch result"]; + 3 [label="Exit when"]; } - 14 [label="Exit function test" style="filled" fillcolor=red]; + 1 [label="Exit function test" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; + 0 -> {2}; + 2 -> {4}; + 3 -> {1}; 4 -> {5}; 5 -> {6}; - 6 -> {8 7}; - 7 -> {13}; - 8 -> {9}; + 6 -> {7}; + 7 -> {8}; + 8 -> {9 14}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {14}; + 13 -> {3}; + 14 -> {3}; } 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 af7c37f6f7b..dad20c836f2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot @@ -8,7 +8,6 @@ digraph dataFlowInfoFromWhileCondition_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph dataFlowInfoFromWhileCondition_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph dataFlowInfoFromWhileCondition_kt { 4 [label="Enter class B" style="filled" fillcolor=red]; 5 [label="Exit class B" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; subgraph cluster_3 { @@ -32,70 +29,68 @@ digraph dataFlowInfoFromWhileCondition_kt { 6 [label="Enter class C" style="filled" fillcolor=red]; 7 [label="Exit class C" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function test" style="filled" fillcolor=red]; - 9 [label="Const: Null(null)"]; - 10 [label="Variable declaration: lvar a: R|A?|"]; + 10 [label="Const: Null(null)"]; + 11 [label="Variable declaration: lvar a: R|A?|"]; subgraph cluster_5 { color=blue - 11 [label="Enter while loop"]; + 12 [label="Enter while loop"]; subgraph cluster_6 { color=blue - 12 [label="Enter loop condition"]; + 14 [label="Enter loop condition"]; subgraph cluster_7 { color=blue - 13 [label="Enter ||"]; - 14 [label="Access variable R|/a|"]; - 15 [label="Type operator: (R|/a| is R|B|)"]; - 16 [label="Exit left part of ||"]; - 17 [label="Enter right part of ||"]; - 18 [label="Access variable R|/a|"]; - 19 [label="Type operator: (R|/a| is R|C|)"]; - 20 [label="Exit ||"]; + 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 ||"]; } - 21 [label="Exit loop condition"]; + 23 [label="Exit loop condition"]; } subgraph cluster_8 { color=blue - 22 [label="Enter loop block"]; + 24 [label="Enter loop block"]; subgraph cluster_9 { color=blue - 23 [label="Enter block"]; - 24 [label="Access variable R|/a|"]; - 25 [label="Function call: R|/a|.R|/A.foo|()"]; - 26 [label="Exit block"]; + 25 [label="Enter block"]; + 26 [label="Access variable R|/a|"]; + 27 [label="Function call: R|/a|.R|/A.foo|()"]; + 28 [label="Exit block"]; } - 27 [label="Exit loop block"]; + 29 [label="Exit loop block"]; } - 28 [label="Exit whileloop"]; + 13 [label="Exit whileloop"]; } - 29 [label="Exit function test" style="filled" fillcolor=red]; + 9 [label="Exit function test" style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; + 8 -> {10}; 10 -> {11}; 11 -> {12}; - 12 -> {13}; - 13 -> {14}; - 14 -> {15}; - 15 -> {16}; - 16 -> {20 17}; + 12 -> {14}; + 13 -> {9}; + 14 -> {16}; + 15 -> {23}; + 16 -> {17}; 17 -> {18}; 18 -> {19}; - 19 -> {20}; + 19 -> {15 20}; 20 -> {21}; - 21 -> {28 22}; - 22 -> {23}; - 23 -> {24}; + 21 -> {22}; + 22 -> {15}; + 23 -> {13 24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {12}; + 27 -> {28}; 28 -> {29}; + 29 -> {14}; } 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 070c619cf1a..89bd96a9300 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot @@ -8,7 +8,6 @@ digraph endlessLoops_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph endlessLoops_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,571 +22,564 @@ digraph endlessLoops_kt { 4 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 5 [label="Enter while loop"]; + 6 [label="Enter while loop"]; subgraph cluster_4 { color=blue - 6 [label="Enter loop condition"]; - 7 [label="Const: Boolean(true)"]; - 8 [label="Exit loop condition"]; + 8 [label="Enter loop condition"]; + 9 [label="Const: Boolean(true)"]; + 10 [label="Exit loop condition"]; } subgraph cluster_5 { color=blue - 9 [label="Enter loop block"]; + 11 [label="Enter loop block"]; subgraph cluster_6 { color=blue - 10 [label="Enter block"]; - 11 [label="Access variable R|/x|"]; - 12 [label="Type operator: (R|/x| as R|A|)"]; + 12 [label="Enter block"]; + 13 [label="Access variable R|/x|"]; + 14 [label="Type operator: (R|/x| as R|A|)"]; subgraph cluster_7 { color=blue - 13 [label="Enter when"]; + 15 [label="Enter when"]; subgraph cluster_8 { color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Access variable R|/b|"]; - 16 [label="Exit when branch condition"]; + 17 [label="Enter when branch condition "]; + 18 [label="Access variable R|/b|"]; + 19 [label="Exit when branch condition"]; } - 17 [label="Synthetic else branch"]; - 18 [label="Enter when branch result"]; + 26 [label="Synthetic else branch"]; + 20 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 19 [label="Enter block"]; - 20 [label="Jump: break@@@[Boolean(true)] "]; - 21 [label="Stub" style="filled" fillcolor=gray]; - 22 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 23 [label="Exit when branch result" style="filled" fillcolor=gray]; - 24 [label="Exit when"]; + 25 [label="Exit when branch result" style="filled" fillcolor=gray]; + 16 [label="Exit when"]; } - 25 [label="Exit block"]; + 27 [label="Exit block"]; } - 26 [label="Exit loop block"]; + 28 [label="Exit loop block"]; } - 27 [label="Exit whileloop"]; + 7 [label="Exit whileloop"]; } - 28 [label="Access variable R|/x|"]; - 29 [label="Function call: R|/x|.R|/A.foo|()"]; - 30 [label="Exit function test_1" style="filled" fillcolor=red]; + 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 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; + 4 -> {6}; + 6 -> {8}; + 7 -> {29}; 8 -> {9}; - 8 -> {27} [style=dotted]; 9 -> {10}; 10 -> {11}; + 10 -> {7} [style=dotted]; 11 -> {12}; 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {16}; - 16 -> {18 17}; - 17 -> {24}; + 15 -> {17}; + 16 -> {27}; + 17 -> {18}; 18 -> {19}; - 19 -> {20}; - 20 -> {27}; - 20 -> {21} [style=dotted]; - 21 -> {22} [style=dotted]; + 19 -> {20 26}; + 20 -> {21}; + 21 -> {22}; + 22 -> {7}; 22 -> {23} [style=dotted]; 23 -> {24} [style=dotted]; - 24 -> {25}; - 25 -> {26}; - 26 -> {6}; + 24 -> {25} [style=dotted]; + 25 -> {16} [style=dotted]; + 26 -> {16}; 27 -> {28}; - 28 -> {29}; + 28 -> {8}; 29 -> {30}; + 30 -> {5}; subgraph cluster_10 { color=red 31 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_11 { color=blue - 32 [label="Enter while loop"]; + 33 [label="Enter while loop"]; subgraph cluster_12 { color=blue - 33 [label="Enter loop condition"]; - 34 [label="Const: Boolean(true)"]; - 35 [label="Exit loop condition"]; + 35 [label="Enter loop condition"]; + 36 [label="Const: Boolean(true)"]; + 37 [label="Exit loop condition"]; } subgraph cluster_13 { color=blue - 36 [label="Enter loop block"]; + 38 [label="Enter loop block"]; subgraph cluster_14 { color=blue - 37 [label="Enter block"]; + 39 [label="Enter block"]; subgraph cluster_15 { color=blue - 38 [label="Enter when"]; + 40 [label="Enter when"]; subgraph cluster_16 { color=blue - 39 [label="Enter when branch condition "]; - 40 [label="Access variable R|/b|"]; - 41 [label="Exit when branch condition"]; + 42 [label="Enter when branch condition "]; + 43 [label="Access variable R|/b|"]; + 44 [label="Exit when branch condition"]; } - 42 [label="Synthetic else branch"]; - 43 [label="Enter when branch result"]; + 53 [label="Synthetic else branch"]; + 45 [label="Enter when branch result"]; subgraph cluster_17 { color=blue - 44 [label="Enter block"]; - 45 [label="Access variable R|/x|"]; - 46 [label="Type operator: (R|/x| as R|A|)"]; - 47 [label="Jump: break@@@[Boolean(true)] "]; - 48 [label="Stub" style="filled" fillcolor=gray]; - 49 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 50 [label="Exit when branch result" style="filled" fillcolor=gray]; - 51 [label="Exit when"]; + 52 [label="Exit when branch result" style="filled" fillcolor=gray]; + 41 [label="Exit when"]; } - 52 [label="Exit block"]; + 54 [label="Exit block"]; } - 53 [label="Exit loop block"]; + 55 [label="Exit loop block"]; } - 54 [label="Exit whileloop"]; + 34 [label="Exit whileloop"]; } - 55 [label="Access variable R|/x|"]; - 56 [label="Function call: R|/x|.R|/A.foo|()"]; - 57 [label="Exit function test_2" style="filled" fillcolor=red]; + 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]; } - - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {35}; + 31 -> {33}; + 33 -> {35}; + 34 -> {56}; 35 -> {36}; - 35 -> {54} [style=dotted]; 36 -> {37}; 37 -> {38}; + 37 -> {34} [style=dotted]; 38 -> {39}; 39 -> {40}; - 40 -> {41}; - 41 -> {43 42}; - 42 -> {51}; + 40 -> {42}; + 41 -> {54}; + 42 -> {43}; 43 -> {44}; - 44 -> {45}; + 44 -> {45 53}; 45 -> {46}; 46 -> {47}; - 47 -> {54}; - 47 -> {48} [style=dotted]; - 48 -> {49} [style=dotted]; + 47 -> {48}; + 48 -> {49}; + 49 -> {34}; 49 -> {50} [style=dotted]; 50 -> {51} [style=dotted]; - 51 -> {52}; - 52 -> {53}; - 53 -> {33}; + 51 -> {52} [style=dotted]; + 52 -> {41} [style=dotted]; + 53 -> {41}; 54 -> {55}; - 55 -> {56}; + 55 -> {35}; 56 -> {57}; + 57 -> {32}; subgraph cluster_18 { color=red 58 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_19 { color=blue - 59 [label="Enter while loop"]; + 60 [label="Enter while loop"]; subgraph cluster_20 { color=blue - 60 [label="Enter loop condition"]; - 61 [label="Const: Boolean(true)"]; - 62 [label="Exit loop condition"]; + 62 [label="Enter loop condition"]; + 63 [label="Const: Boolean(true)"]; + 64 [label="Exit loop condition"]; } subgraph cluster_21 { color=blue - 63 [label="Enter loop block"]; + 65 [label="Enter loop block"]; subgraph cluster_22 { color=blue - 64 [label="Enter block"]; - 65 [label="Access variable R|/x|"]; - 66 [label="Type operator: (R|/x| as R|A|)"]; + 66 [label="Enter block"]; + 67 [label="Access variable R|/x|"]; + 68 [label="Type operator: (R|/x| as R|A|)"]; subgraph cluster_23 { color=blue - 67 [label="Enter when"]; + 69 [label="Enter when"]; subgraph cluster_24 { color=blue - 68 [label="Enter when branch condition "]; - 69 [label="Access variable R|/b|"]; - 70 [label="Exit when branch condition"]; + 71 [label="Enter when branch condition "]; + 72 [label="Access variable R|/b|"]; + 73 [label="Exit when branch condition"]; } - 71 [label="Synthetic else branch"]; - 72 [label="Enter when branch result"]; + 80 [label="Synthetic else branch"]; + 74 [label="Enter when branch result"]; subgraph cluster_25 { 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]; + 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]; } - 77 [label="Exit when branch result" style="filled" fillcolor=gray]; - 78 [label="Exit when"]; + 79 [label="Exit when branch result" style="filled" fillcolor=gray]; + 70 [label="Exit when"]; } subgraph cluster_26 { color=blue - 79 [label="Enter when"]; + 81 [label="Enter when"]; subgraph cluster_27 { color=blue - 80 [label="Enter when branch condition "]; - 81 [label="Access variable R|/b|"]; - 82 [label="Exit when branch condition"]; + 83 [label="Enter when branch condition "]; + 84 [label="Access variable R|/b|"]; + 85 [label="Exit when branch condition"]; } - 83 [label="Synthetic else branch"]; - 84 [label="Enter when branch result"]; + 92 [label="Synthetic else branch"]; + 86 [label="Enter when branch result"]; subgraph cluster_28 { 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]; + 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]; } - 89 [label="Exit when branch result" style="filled" fillcolor=gray]; - 90 [label="Exit when"]; + 91 [label="Exit when branch result" style="filled" fillcolor=gray]; + 82 [label="Exit when"]; } - 91 [label="Exit block"]; + 93 [label="Exit block"]; } - 92 [label="Exit loop block"]; + 94 [label="Exit loop block"]; } - 93 [label="Exit whileloop"]; + 61 [label="Exit whileloop"]; } - 94 [label="Access variable R|/x|"]; - 95 [label="Function call: R|/x|.R|/A.foo|()"]; - 96 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - - 58 -> {59}; - 59 -> {60}; - 60 -> {61}; - 61 -> {62}; + 58 -> {60}; + 60 -> {62}; + 61 -> {95}; 62 -> {63}; - 62 -> {93} [style=dotted]; 63 -> {64}; 64 -> {65}; + 64 -> {61} [style=dotted]; 65 -> {66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; - 69 -> {70}; - 70 -> {72 71}; - 71 -> {78}; + 69 -> {71}; + 70 -> {81}; + 71 -> {72}; 72 -> {73}; - 73 -> {74}; - 74 -> {93}; - 74 -> {75} [style=dotted]; - 75 -> {76} [style=dotted]; + 73 -> {74 80}; + 74 -> {75}; + 75 -> {76}; + 76 -> {61}; 76 -> {77} [style=dotted]; 77 -> {78} [style=dotted]; - 78 -> {79}; - 79 -> {80}; - 80 -> {81}; - 81 -> {82}; - 82 -> {84 83}; - 83 -> {90}; + 78 -> {79} [style=dotted]; + 79 -> {70} [style=dotted]; + 80 -> {70}; + 81 -> {83}; + 82 -> {93}; + 83 -> {84}; 84 -> {85}; - 85 -> {86}; - 86 -> {93}; - 86 -> {87} [style=dotted]; - 87 -> {88} [style=dotted]; + 85 -> {86 92}; + 86 -> {87}; + 87 -> {88}; + 88 -> {61}; 88 -> {89} [style=dotted]; 89 -> {90} [style=dotted]; - 90 -> {91}; - 91 -> {92}; - 92 -> {60}; + 90 -> {91} [style=dotted]; + 91 -> {82} [style=dotted]; + 92 -> {82}; 93 -> {94}; - 94 -> {95}; + 94 -> {62}; 95 -> {96}; + 96 -> {59}; subgraph cluster_29 { color=red 97 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_30 { color=blue - 98 [label="Enter while loop"]; + 99 [label="Enter while loop"]; subgraph cluster_31 { color=blue - 99 [label="Enter loop condition"]; - 100 [label="Const: Boolean(true)"]; - 101 [label="Exit loop condition"]; + 101 [label="Enter loop condition"]; + 102 [label="Const: Boolean(true)"]; + 103 [label="Exit loop condition"]; } subgraph cluster_32 { color=blue - 102 [label="Enter loop block"]; + 104 [label="Enter loop block"]; subgraph cluster_33 { color=blue - 103 [label="Enter block"]; + 105 [label="Enter block"]; subgraph cluster_34 { color=blue - 104 [label="Enter when"]; + 106 [label="Enter when"]; subgraph cluster_35 { color=blue - 105 [label="Enter when branch condition "]; - 106 [label="Access variable R|/b|"]; - 107 [label="Exit when branch condition"]; + 108 [label="Enter when branch condition "]; + 109 [label="Access variable R|/b|"]; + 110 [label="Exit when branch condition"]; } - 108 [label="Synthetic else branch"]; - 109 [label="Enter when branch result"]; + 119 [label="Synthetic else branch"]; + 111 [label="Enter when branch result"]; subgraph cluster_36 { color=blue - 110 [label="Enter block"]; - 111 [label="Access variable R|/x|"]; - 112 [label="Type operator: (R|/x| as R|A|)"]; - 113 [label="Jump: break@@@[Boolean(true)] "]; - 114 [label="Stub" style="filled" fillcolor=gray]; - 115 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 116 [label="Exit when branch result" style="filled" fillcolor=gray]; - 117 [label="Exit when"]; + 118 [label="Exit when branch result" style="filled" fillcolor=gray]; + 107 [label="Exit when"]; } - 118 [label="Jump: break@@@[Boolean(true)] "]; - 119 [label="Stub" style="filled" fillcolor=gray]; - 120 [label="Exit block" style="filled" fillcolor=gray]; + 120 [label="Jump: break@@@[Boolean(true)] "]; + 121 [label="Stub" style="filled" fillcolor=gray]; + 122 [label="Exit block" style="filled" fillcolor=gray]; } - 121 [label="Exit loop block" style="filled" fillcolor=gray]; + 123 [label="Exit loop block" style="filled" fillcolor=gray]; } - 122 [label="Exit whileloop"]; + 100 [label="Exit whileloop"]; } - 123 [label="Access variable R|/x|"]; - 124 [label="Function call: R|/x|.#()"]; - 125 [label="Exit function test_4" style="filled" fillcolor=red]; + 124 [label="Access variable R|/x|"]; + 125 [label="Function call: R|/x|.#()"]; + 98 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 97 -> {98}; - 98 -> {99}; - 99 -> {100}; - 100 -> {101}; + 97 -> {99}; + 99 -> {101}; + 100 -> {124}; 101 -> {102}; - 101 -> {122} [style=dotted]; 102 -> {103}; 103 -> {104}; + 103 -> {100} [style=dotted]; 104 -> {105}; 105 -> {106}; - 106 -> {107}; - 107 -> {109 108}; - 108 -> {117}; + 106 -> {108}; + 107 -> {120}; + 108 -> {109}; 109 -> {110}; - 110 -> {111}; + 110 -> {111 119}; 111 -> {112}; 112 -> {113}; - 113 -> {122}; - 113 -> {114} [style=dotted]; - 114 -> {115} [style=dotted]; + 113 -> {114}; + 114 -> {115}; + 115 -> {100}; 115 -> {116} [style=dotted]; 116 -> {117} [style=dotted]; - 117 -> {118}; - 118 -> {122}; - 118 -> {119} [style=dotted]; - 119 -> {120} [style=dotted]; + 117 -> {118} [style=dotted]; + 118 -> {107} [style=dotted]; + 119 -> {107}; + 120 -> {100}; 120 -> {121} [style=dotted]; - 121 -> {99} [style=dotted]; - 122 -> {123}; - 123 -> {124}; + 121 -> {122} [style=dotted]; + 122 -> {123} [style=dotted]; + 123 -> {101} [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 - 127 [label="Enter do-while loop"]; + 128 [label="Enter do-while loop"]; subgraph cluster_39 { color=blue - 128 [label="Enter loop block"]; + 130 [label="Enter loop block"]; subgraph cluster_40 { color=blue - 129 [label="Enter block"]; + 131 [label="Enter block"]; subgraph cluster_41 { color=blue - 130 [label="Enter when"]; + 132 [label="Enter when"]; subgraph cluster_42 { color=blue - 131 [label="Enter when branch condition "]; - 132 [label="Access variable R|/b|"]; - 133 [label="Exit when branch condition"]; + 134 [label="Enter when branch condition "]; + 135 [label="Access variable R|/b|"]; + 136 [label="Exit when branch condition"]; } - 134 [label="Synthetic else branch"]; - 135 [label="Enter when branch result"]; + 145 [label="Synthetic else branch"]; + 137 [label="Enter when branch result"]; subgraph cluster_43 { color=blue - 136 [label="Enter block"]; - 137 [label="Access variable R|/x|"]; - 138 [label="Type operator: (R|/x| as R|A|)"]; - 139 [label="Jump: break@@@[Boolean(true)] "]; - 140 [label="Stub" style="filled" fillcolor=gray]; - 141 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 142 [label="Exit when branch result" style="filled" fillcolor=gray]; - 143 [label="Exit when"]; + 144 [label="Exit when branch result" style="filled" fillcolor=gray]; + 133 [label="Exit when"]; } - 144 [label="Exit block"]; + 146 [label="Exit block"]; } - 145 [label="Exit loop block"]; + 147 [label="Exit loop block"]; } subgraph cluster_44 { color=blue - 146 [label="Enter loop condition"]; - 147 [label="Const: Boolean(true)"]; - 148 [label="Exit loop condition"]; + 148 [label="Enter loop condition"]; + 149 [label="Const: Boolean(true)"]; + 150 [label="Exit loop condition"]; } - 149 [label="Exit do-whileloop"]; + 129 [label="Exit do-whileloop"]; } - 150 [label="Access variable R|/x|"]; - 151 [label="Function call: R|/x|.R|/A.foo|()"]; - 152 [label="Exit function test_5" style="filled" fillcolor=red]; + 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 -> {127}; - 127 -> {128}; - 128 -> {129}; - 129 -> {130}; + 126 -> {128}; + 128 -> {130}; + 129 -> {151}; 130 -> {131}; 131 -> {132}; - 132 -> {133}; - 133 -> {135 134}; - 134 -> {143}; + 132 -> {134}; + 133 -> {146}; + 134 -> {135}; 135 -> {136}; - 136 -> {137}; + 136 -> {137 145}; 137 -> {138}; 138 -> {139}; - 139 -> {149}; - 139 -> {140} [style=dotted]; - 140 -> {141} [style=dotted]; + 139 -> {140}; + 140 -> {141}; + 141 -> {129}; 141 -> {142} [style=dotted]; 142 -> {143} [style=dotted]; - 143 -> {144}; - 144 -> {145}; - 145 -> {146}; + 143 -> {144} [style=dotted]; + 144 -> {133} [style=dotted]; + 145 -> {133}; 146 -> {147}; 147 -> {148}; - 148 -> {128}; - 148 -> {149} [style=dotted]; + 148 -> {149}; 149 -> {150}; - 150 -> {151}; + 150 -> {130}; + 150 -> {129} [style=dotted]; 151 -> {152}; + 152 -> {127}; subgraph cluster_45 { color=red 153 [label="Enter function test_6" style="filled" fillcolor=red]; subgraph cluster_46 { color=blue - 154 [label="Enter do-while loop"]; + 155 [label="Enter do-while loop"]; subgraph cluster_47 { color=blue - 155 [label="Enter loop block"]; + 157 [label="Enter loop block"]; subgraph cluster_48 { color=blue - 156 [label="Enter block"]; - 157 [label="Access variable R|/x|"]; - 158 [label="Type operator: (R|/x| as R|A|)"]; + 158 [label="Enter block"]; + 159 [label="Access variable R|/x|"]; + 160 [label="Type operator: (R|/x| as R|A|)"]; subgraph cluster_49 { color=blue - 159 [label="Enter when"]; + 161 [label="Enter when"]; subgraph cluster_50 { color=blue - 160 [label="Enter when branch condition "]; - 161 [label="Access variable R|/b|"]; - 162 [label="Exit when branch condition"]; + 163 [label="Enter when branch condition "]; + 164 [label="Access variable R|/b|"]; + 165 [label="Exit when branch condition"]; } - 163 [label="Synthetic else branch"]; - 164 [label="Enter when branch result"]; + 172 [label="Synthetic else branch"]; + 166 [label="Enter when branch result"]; subgraph cluster_51 { color=blue - 165 [label="Enter block"]; - 166 [label="Jump: break@@@[Boolean(true)] "]; - 167 [label="Stub" style="filled" fillcolor=gray]; - 168 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 169 [label="Exit when branch result" style="filled" fillcolor=gray]; - 170 [label="Exit when"]; + 171 [label="Exit when branch result" style="filled" fillcolor=gray]; + 162 [label="Exit when"]; } - 171 [label="Exit block"]; + 173 [label="Exit block"]; } - 172 [label="Exit loop block"]; + 174 [label="Exit loop block"]; } subgraph cluster_52 { color=blue - 173 [label="Enter loop condition"]; - 174 [label="Const: Boolean(true)"]; - 175 [label="Exit loop condition"]; + 175 [label="Enter loop condition"]; + 176 [label="Const: Boolean(true)"]; + 177 [label="Exit loop condition"]; } - 176 [label="Exit do-whileloop"]; + 156 [label="Exit do-whileloop"]; } - 177 [label="Access variable R|/x|"]; - 178 [label="Function call: R|/x|.R|/A.foo|()"]; - 179 [label="Exit function test_6" style="filled" fillcolor=red]; + 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 -> {154}; - 154 -> {155}; - 155 -> {156}; - 156 -> {157}; + 153 -> {155}; + 155 -> {157}; + 156 -> {178}; 157 -> {158}; 158 -> {159}; 159 -> {160}; 160 -> {161}; - 161 -> {162}; - 162 -> {164 163}; - 163 -> {170}; + 161 -> {163}; + 162 -> {173}; + 163 -> {164}; 164 -> {165}; - 165 -> {166}; - 166 -> {176}; - 166 -> {167} [style=dotted]; - 167 -> {168} [style=dotted]; + 165 -> {166 172}; + 166 -> {167}; + 167 -> {168}; + 168 -> {156}; 168 -> {169} [style=dotted]; 169 -> {170} [style=dotted]; - 170 -> {171}; - 171 -> {172}; - 172 -> {173}; + 170 -> {171} [style=dotted]; + 171 -> {162} [style=dotted]; + 172 -> {162}; 173 -> {174}; 174 -> {175}; - 175 -> {155}; - 175 -> {176} [style=dotted]; + 175 -> {176}; 176 -> {177}; - 177 -> {178}; + 177 -> {157}; + 177 -> {156} [style=dotted]; 178 -> {179}; + 179 -> {154}; subgraph cluster_53 { color=red 180 [label="Enter function test_7" style="filled" fillcolor=red]; subgraph cluster_54 { color=blue - 181 [label="Enter do-while loop"]; + 182 [label="Enter do-while loop"]; subgraph cluster_55 { color=blue - 182 [label="Enter loop block"]; + 184 [label="Enter loop block"]; subgraph cluster_56 { color=blue - 183 [label="Enter block"]; - 184 [label="Access variable R|/x|"]; - 185 [label="Type operator: (R|/x| as R|A|)"]; - 186 [label="Exit block"]; + 185 [label="Enter block"]; + 186 [label="Access variable R|/x|"]; + 187 [label="Type operator: (R|/x| as R|A|)"]; + 188 [label="Exit block"]; } - 187 [label="Exit loop block"]; + 189 [label="Exit loop block"]; } subgraph cluster_57 { color=blue - 188 [label="Enter loop condition"]; - 189 [label="Const: Boolean(true)"]; - 190 [label="Exit loop condition"]; + 190 [label="Enter loop condition"]; + 191 [label="Const: Boolean(true)"]; + 192 [label="Exit loop condition"]; } - 191 [label="Exit do-whileloop" style="filled" fillcolor=gray]; + 183 [label="Exit do-whileloop" style="filled" fillcolor=gray]; } - 192 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 193 [label="Function call: R|/x|.R|/A.foo|()" style="filled" fillcolor=gray]; - 194 [label="Exit function test_7" style="filled" fillcolor=red 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 -> {181}; - 181 -> {182}; - 182 -> {183}; - 183 -> {184}; + 180 -> {182}; + 182 -> {184}; + 183 -> {193} [style=dotted]; 184 -> {185}; 185 -> {186}; 186 -> {187}; 187 -> {188}; 188 -> {189}; 189 -> {190}; - 190 -> {182}; - 190 -> {191} [style=dotted]; - 191 -> {192} [style=dotted]; - 192 -> {193} [style=dotted]; + 190 -> {191}; + 191 -> {192}; + 192 -> {184}; + 192 -> {183} [style=dotted]; 193 -> {194} [style=dotted]; + 194 -> {181} [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 eccb2ef1fc6..8fb3c88ed5d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot @@ -8,7 +8,6 @@ digraph multipleCasts_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph multipleCasts_kt { 2 [label="Enter class A" style="filled" fillcolor=red]; 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph multipleCasts_kt { 4 [label="Enter function foo" style="filled" fillcolor=red]; 5 [label="Exit function foo" style="filled" fillcolor=red]; } - 4 -> {5}; subgraph cluster_3 { @@ -32,44 +29,40 @@ digraph multipleCasts_kt { 6 [label="Enter class B" style="filled" fillcolor=red]; 7 [label="Exit class B" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function getAny" style="filled" fillcolor=red]; - 9 [label="Const: Null(null)"]; - 10 [label="Jump: ^getAny Null(null)"]; - 11 [label="Stub" style="filled" fillcolor=gray]; - 12 [label="Exit function getAny" style="filled" fillcolor=red]; + 10 [label="Const: Null(null)"]; + 11 [label="Jump: ^getAny Null(null)"]; + 12 [label="Stub" style="filled" fillcolor=gray]; + 9 [label="Exit function getAny" style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; - 10 -> {12}; - 10 -> {11} [style=dotted]; + 8 -> {10}; + 10 -> {11}; + 11 -> {9}; 11 -> {12} [style=dotted]; + 12 -> {9} [style=dotted]; subgraph cluster_5 { color=red 13 [label="Enter function test_0" style="filled" fillcolor=red]; - 14 [label="Function call: R|/getAny|()"]; - 15 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 16 [label="Function call: R|/getAny|()"]; - 17 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - 18 [label="Access variable R|/a|"]; - 19 [label="Type operator: (R|/a| as R|A|)"]; - 20 [label="Access variable R|/a|"]; - 21 [label="Function call: R|/a|.R|/A.foo|()"]; - 22 [label="Access variable R|/b|"]; - 23 [label="Type operator: (R|/b| as R|B|)"]; - 24 [label="Access variable R|/b|"]; - 25 [label="Function call: R|/b|.R|/B.foo|()"]; - 26 [label="Exit 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]; } - - 13 -> {14}; - 14 -> {15}; + 13 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; @@ -81,68 +74,67 @@ digraph multipleCasts_kt { 23 -> {24}; 24 -> {25}; 25 -> {26}; + 26 -> {14}; subgraph cluster_6 { color=red 27 [label="Enter function test_1" style="filled" fillcolor=red]; - 28 [label="Function call: R|/getAny|()"]; - 29 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 30 [label="Function call: R|/getAny|()"]; - 31 [label="Variable declaration: lval b: R|kotlin/Any?|"]; + 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 { color=blue - 32 [label="Enter when"]; + 33 [label="Enter when"]; subgraph cluster_8 { color=blue - 33 [label="Enter when branch condition "]; + 35 [label="Enter when branch condition "]; subgraph cluster_9 { color=blue - 34 [label="Enter &&"]; - 35 [label="Access variable R|/a|"]; - 36 [label="Type operator: (R|/a| is R|A|)"]; - 37 [label="Exit left part of &&"]; - 38 [label="Enter right part of &&"]; - 39 [label="Access variable R|/b|"]; - 40 [label="Type operator: (R|/b| is R|B|)"]; - 41 [label="Exit &&"]; + 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 &&"]; } - 42 [label="Exit when branch condition"]; + 44 [label="Exit when branch condition"]; } - 43 [label="Synthetic else branch"]; - 44 [label="Enter when branch result"]; + 53 [label="Synthetic else branch"]; + 45 [label="Enter when branch result"]; subgraph cluster_10 { color=blue - 45 [label="Enter block"]; - 46 [label="Access variable R|/a|"]; - 47 [label="Function call: R|/a|.R|/A.foo|()"]; - 48 [label="Access variable R|/b|"]; - 49 [label="Function call: R|/b|.R|/B.foo|()"]; - 50 [label="Exit block"]; + 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"]; } - 51 [label="Exit when branch result"]; - 52 [label="Exit when"]; + 52 [label="Exit when branch result"]; + 34 [label="Exit when"]; } - 53 [label="Exit function test_1" style="filled" fillcolor=red]; + 28 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 27 -> {28}; - 28 -> {29}; + 27 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; - 33 -> {34}; - 34 -> {35}; - 35 -> {36}; - 36 -> {37}; - 37 -> {41 38}; + 33 -> {35}; + 34 -> {28}; + 35 -> {37}; + 36 -> {44}; + 37 -> {38}; 38 -> {39}; 39 -> {40}; - 40 -> {41}; + 40 -> {36 41}; 41 -> {42}; - 42 -> {44 43}; - 43 -> {52}; - 44 -> {45}; + 42 -> {43}; + 43 -> {36}; + 44 -> {45 53}; 45 -> {46}; 46 -> {47}; 47 -> {48}; @@ -150,6 +142,7 @@ digraph multipleCasts_kt { 49 -> {50}; 50 -> {51}; 51 -> {52}; - 52 -> {53}; + 52 -> {34}; + 53 -> {34}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot index 5538bdc64f5..7b457a001b4 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot @@ -8,7 +8,6 @@ digraph nullability_kt { 0 [label="Enter function foo" style="filled" fillcolor=red]; 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph nullability_kt { 2 [label="Enter function getA" style="filled" fillcolor=red]; 3 [label="Exit function getA" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { @@ -24,7 +22,6 @@ digraph nullability_kt { 4 [label="Enter class A" style="filled" fillcolor=red]; 5 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; subgraph cluster_3 { @@ -32,129 +29,117 @@ digraph nullability_kt { 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 property" style="filled" fillcolor=red]; - 9 [label="Exit property" style="filled" fillcolor=red]; - } - - 8 -> {9}; - - subgraph cluster_5 { color=red 10 [label="Enter function fs" style="filled" fillcolor=red]; 11 [label="Exit function fs" style="filled" fillcolor=red]; } - 10 -> {11}; - subgraph cluster_6 { + subgraph cluster_5 { color=red 12 [label="Enter class MyData" 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]; } - + 12 -> {8} [color=green]; + 8 -> {9}; + 9 -> {13} [color=green]; subgraph cluster_7 { color=red 14 [label="Enter function getter" style="filled" fillcolor=red]; 15 [label="Exit function getter" style="filled" fillcolor=red]; } - 14 -> {15}; subgraph cluster_8 { - color=red - 16 [label="Enter property" style="filled" fillcolor=red]; - 17 [label="Exit property" style="filled" fillcolor=red]; - } - - 16 -> {17}; - - subgraph cluster_9 { color=red 18 [label="Enter function fdata" style="filled" fillcolor=red]; 19 [label="Exit function fdata" style="filled" fillcolor=red]; } - 18 -> {19}; - subgraph cluster_10 { + subgraph cluster_9 { color=red 20 [label="Enter class Q" 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]; } - + 20 -> {16} [color=green]; + 16 -> {17}; + 17 -> {21} [color=green]; subgraph cluster_11 { color=red 22 [label="Enter function " style="filled" fillcolor=red]; - 23 [label="Delegated constructor call: super()"]; - 24 [label="Exit function " style="filled" fillcolor=red]; + 24 [label="Delegated constructor call: super()"]; + 23 [label="Exit function " style="filled" fillcolor=red]; } - - 22 -> {23}; - 23 -> {24}; + 22 -> {24}; + 24 -> {23}; subgraph cluster_12 { color=red 25 [label="Enter function getter" style="filled" fillcolor=red]; 26 [label="Exit function getter" style="filled" fillcolor=red]; } - 25 -> {26}; subgraph cluster_13 { - color=red - 27 [label="Enter property" style="filled" fillcolor=red]; - 28 [label="Access variable R|/data|"]; - 29 [label="Exit property" style="filled" fillcolor=red]; - } - - 27 -> {28}; - 28 -> {29}; - - subgraph cluster_14 { color=red 30 [label="Enter function fdata" style="filled" fillcolor=red]; - 31 [label="Const: Null(null)"]; - 32 [label="Jump: ^fdata Null(null)"]; - 33 [label="Stub" style="filled" fillcolor=gray]; - 34 [label="Exit 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 -> {31}; - 31 -> {32}; - 32 -> {34}; - 32 -> {33} [style=dotted]; + 30 -> {32}; + 32 -> {33}; + 33 -> {31}; 33 -> {34} [style=dotted]; + 34 -> {31} [style=dotted]; - subgraph cluster_15 { + subgraph cluster_14 { color=red 35 [label="Enter class QImpl" 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]; } - + 35 -> {27} [color=green]; + 27 -> {29}; + 28 -> {36} [color=green]; + 29 -> {28}; subgraph cluster_16 { color=red 37 [label="Enter function " style="filled" fillcolor=red]; - 38 [label="Delegated constructor call: super()"]; - 39 [label="Exit function " style="filled" fillcolor=red]; + 39 [label="Delegated constructor call: super()"]; + 38 [label="Exit function " style="filled" fillcolor=red]; } - - 37 -> {38}; - 38 -> {39}; + 37 -> {39}; + 39 -> {38}; subgraph cluster_17 { color=red 40 [label="Enter function getter" style="filled" fillcolor=red]; 41 [label="Exit function getter" style="filled" fillcolor=red]; } - 40 -> {41}; subgraph cluster_18 { @@ -162,155 +147,146 @@ digraph nullability_kt { 42 [label="Enter function setter" style="filled" fillcolor=red]; 43 [label="Exit function setter" style="filled" fillcolor=red]; } - 42 -> {43}; subgraph cluster_19 { - color=red - 44 [label="Enter property" style="filled" fillcolor=red]; - 45 [label="Access variable R|/data|"]; - 46 [label="Exit property" style="filled" fillcolor=red]; - } - - 44 -> {45}; - 45 -> {46}; - - subgraph cluster_20 { color=red 47 [label="Enter function fdata" style="filled" fillcolor=red]; - 48 [label="Const: Null(null)"]; - 49 [label="Jump: ^fdata Null(null)"]; - 50 [label="Stub" style="filled" fillcolor=gray]; - 51 [label="Exit 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]; } - - 47 -> {48}; - 48 -> {49}; - 49 -> {51}; - 49 -> {50} [style=dotted]; + 47 -> {49}; + 49 -> {50}; + 50 -> {48}; 50 -> {51} [style=dotted]; + 51 -> {48} [style=dotted]; - subgraph cluster_21 { + subgraph cluster_20 { color=red 52 [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]; + } 53 [label="Exit class QImplMutable" style="filled" fillcolor=red]; } - + 52 -> {44} [color=green]; + 44 -> {46}; + 45 -> {53} [color=green]; + 46 -> {45}; subgraph cluster_22 { color=red 54 [label="Enter function " style="filled" fillcolor=red]; - 55 [label="Delegated constructor call: super()"]; - 56 [label="Exit function " style="filled" fillcolor=red]; + 56 [label="Delegated constructor call: super()"]; + 55 [label="Exit function " style="filled" fillcolor=red]; } - - 54 -> {55}; - 55 -> {56}; + 54 -> {56}; + 56 -> {55}; subgraph cluster_23 { color=red 57 [label="Enter function getter" style="filled" fillcolor=red]; - 58 [label="Const: Null(null)"]; - 59 [label="Jump: ^ Null(null)"]; - 60 [label="Stub" style="filled" fillcolor=gray]; - 61 [label="Exit 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]; } - - 57 -> {58}; - 58 -> {59}; - 59 -> {61}; - 59 -> {60} [style=dotted]; + 57 -> {59}; + 59 -> {60}; + 60 -> {58}; 60 -> {61} [style=dotted]; + 61 -> {58} [style=dotted]; subgraph cluster_24 { - color=red - 62 [label="Enter property" style="filled" fillcolor=red]; - 63 [label="Exit property" style="filled" fillcolor=red]; - } - - 62 -> {63}; - - subgraph cluster_25 { color=red 64 [label="Enter function fdata" style="filled" fillcolor=red]; - 65 [label="Const: Null(null)"]; - 66 [label="Jump: ^fdata Null(null)"]; - 67 [label="Stub" style="filled" fillcolor=gray]; - 68 [label="Exit function fdata" style="filled" fillcolor=red]; + 66 [label="Const: Null(null)"]; + 67 [label="Jump: ^fdata Null(null)"]; + 68 [label="Stub" style="filled" fillcolor=gray]; + 65 [label="Exit function fdata" style="filled" fillcolor=red]; } - - 64 -> {65}; - 65 -> {66}; - 66 -> {68}; - 66 -> {67} [style=dotted]; + 64 -> {66}; + 66 -> {67}; + 67 -> {65}; 67 -> {68} [style=dotted]; + 68 -> {65} [style=dotted]; - subgraph cluster_26 { + subgraph cluster_25 { color=red 69 [label="Enter class QImplWithCustomGetter" 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]; subgraph cluster_27 { color=red 71 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_28 { color=blue - 72 [label="Enter when"]; + 73 [label="Enter when"]; subgraph cluster_29 { color=blue - 73 [label="Enter when branch condition "]; - 74 [label="Access variable R|/x|"]; - 75 [label="Const: Null(null)"]; - 76 [label="Operator !="]; - 77 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_30 { color=blue - 78 [label="Enter when branch condition else"]; - 79 [label="Exit when branch condition"]; + 86 [label="Enter when branch condition else"]; + 87 [label="Exit when branch condition"]; } - 80 [label="Enter when branch result"]; + 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|.#()"]; + 83 [label="Function call: R|/x|.R|/A.foo|()"]; 84 [label="Exit block"]; } 85 [label="Exit when branch result"]; - 86 [label="Enter when branch result"]; - subgraph cluster_32 { - color=blue - 87 [label="Enter block"]; - 88 [label="Access variable R|/x|"]; - 89 [label="Function call: R|/x|.R|/A.foo|()"]; - 90 [label="Exit block"]; - } - 91 [label="Exit when branch result"]; - 92 [label="Exit when"]; + 74 [label="Exit when"]; } - 93 [label="Access variable R|/x|"]; - 94 [label="Function call: R|/x|.#()"]; - 95 [label="Exit function test_1" style="filled" fillcolor=red]; + 94 [label="Access variable R|/x|"]; + 95 [label="Function call: R|/x|.#()"]; + 72 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 71 -> {72}; - 72 -> {73}; - 73 -> {74}; - 74 -> {75}; + 71 -> {73}; + 73 -> {75}; + 74 -> {94}; 75 -> {76}; 76 -> {77}; - 77 -> {86 78}; + 77 -> {78}; 78 -> {79}; - 79 -> {80}; + 79 -> {80 86}; 80 -> {81}; 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {92}; + 85 -> {74}; 86 -> {87}; 87 -> {88}; 88 -> {89}; @@ -318,68 +294,67 @@ digraph nullability_kt { 90 -> {91}; 91 -> {92}; 92 -> {93}; - 93 -> {94}; + 93 -> {74}; 94 -> {95}; + 95 -> {72}; subgraph cluster_33 { color=red 96 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_34 { color=blue - 97 [label="Enter when"]; + 98 [label="Enter when"]; subgraph cluster_35 { color=blue - 98 [label="Enter when branch condition "]; - 99 [label="Access variable R|/x|"]; - 100 [label="Const: Null(null)"]; - 101 [label="Operator =="]; - 102 [label="Exit when branch condition"]; + 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 - 103 [label="Enter when branch condition else"]; - 104 [label="Exit when branch condition"]; + 111 [label="Enter when branch condition else"]; + 112 [label="Exit when branch condition"]; } - 105 [label="Enter when branch result"]; + 113 [label="Enter when branch result"]; 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"]; + } + 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|.R|/A.foo|()"]; + 108 [label="Function call: R|/x|.#()"]; 109 [label="Exit block"]; } 110 [label="Exit when branch result"]; - 111 [label="Enter when branch result"]; - subgraph cluster_38 { - color=blue - 112 [label="Enter block"]; - 113 [label="Access variable R|/x|"]; - 114 [label="Function call: R|/x|.#()"]; - 115 [label="Exit block"]; - } - 116 [label="Exit when branch result"]; - 117 [label="Exit when"]; + 99 [label="Exit when"]; } - 118 [label="Access variable R|/x|"]; - 119 [label="Function call: R|/x|.#()"]; - 120 [label="Exit function test_2" style="filled" fillcolor=red]; + 119 [label="Access variable R|/x|"]; + 120 [label="Function call: R|/x|.#()"]; + 97 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 96 -> {97}; - 97 -> {98}; - 98 -> {99}; - 99 -> {100}; + 96 -> {98}; + 98 -> {100}; + 99 -> {119}; 100 -> {101}; 101 -> {102}; - 102 -> {111 103}; + 102 -> {103}; 103 -> {104}; - 104 -> {105}; + 104 -> {105 111}; 105 -> {106}; 106 -> {107}; 107 -> {108}; 108 -> {109}; 109 -> {110}; - 110 -> {117}; + 110 -> {99}; 111 -> {112}; 112 -> {113}; 113 -> {114}; @@ -387,198 +362,195 @@ digraph nullability_kt { 115 -> {116}; 116 -> {117}; 117 -> {118}; - 118 -> {119}; + 118 -> {99}; 119 -> {120}; + 120 -> {97}; subgraph cluster_39 { color=red 121 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_40 { color=blue - 122 [label="Enter when"]; - 123 [label="Access variable R|/x|"]; - 124 [label="Variable declaration: lval : R|A?|"]; + 123 [label="Enter when"]; + 125 [label="Access variable R|/x|"]; + 126 [label="Variable declaration: lval : R|A?|"]; subgraph cluster_41 { color=blue - 125 [label="Enter when branch condition "]; - 126 [label="Const: Null(null)"]; - 127 [label="Operator =="]; - 128 [label="Exit when branch condition"]; + 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 - 129 [label="Enter when branch condition else"]; - 130 [label="Exit when branch condition"]; + 137 [label="Enter when branch condition else"]; + 138 [label="Exit when branch condition"]; } - 131 [label="Enter when branch result"]; + 139 [label="Enter when branch result"]; subgraph cluster_43 { color=blue - 132 [label="Enter block"]; - 133 [label="Access variable R|/|"]; - 134 [label="Exit block"]; + 140 [label="Enter block"]; + 141 [label="Access variable R|/|"]; + 142 [label="Exit block"]; } - 135 [label="Exit when branch result"]; - 136 [label="Enter when branch result"]; + 143 [label="Exit when branch result"]; + 131 [label="Enter when branch result"]; subgraph cluster_44 { color=blue - 137 [label="Enter block"]; - 138 [label="Jump: ^test_3 Unit"]; - 139 [label="Stub" style="filled" fillcolor=gray]; - 140 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 141 [label="Exit when branch result" style="filled" fillcolor=gray]; - 142 [label="Exit when"]; + 136 [label="Exit when branch result" style="filled" fillcolor=gray]; + 124 [label="Exit when"]; } - 143 [label="Access variable R|/x|"]; - 144 [label="Function call: R|/x|.R|/A.foo|()"]; - 145 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - - 121 -> {122}; - 122 -> {123}; - 123 -> {124}; - 124 -> {125}; + 121 -> {123}; + 123 -> {125}; + 124 -> {144}; 125 -> {126}; 126 -> {127}; 127 -> {128}; - 128 -> {136 129}; + 128 -> {129}; 129 -> {130}; - 130 -> {131}; + 130 -> {131 137}; 131 -> {132}; 132 -> {133}; - 133 -> {134}; - 134 -> {135}; - 135 -> {142}; - 136 -> {137}; + 133 -> {122}; + 133 -> {134} [style=dotted]; + 134 -> {135} [style=dotted]; + 135 -> {136} [style=dotted]; + 136 -> {124} [style=dotted]; 137 -> {138}; - 138 -> {145}; - 138 -> {139} [style=dotted]; - 139 -> {140} [style=dotted]; - 140 -> {141} [style=dotted]; - 141 -> {142} [style=dotted]; + 138 -> {139}; + 139 -> {140}; + 140 -> {141}; + 141 -> {142}; 142 -> {143}; - 143 -> {144}; + 143 -> {124}; 144 -> {145}; + 145 -> {122}; subgraph cluster_45 { color=red 146 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_46 { color=blue - 147 [label="Enter when"]; + 148 [label="Enter when"]; subgraph cluster_47 { color=blue - 148 [label="Enter when branch condition "]; - 149 [label="Access variable R|/x|"]; - 150 [label="Enter safe call"]; - 151 [label="Function call: R|/x|?.R|/A.getA|()"]; - 152 [label="Exit safe call"]; - 153 [label="Const: Null(null)"]; - 154 [label="Operator =="]; - 155 [label="Exit when branch condition"]; + 150 [label="Enter when branch condition "]; + 151 [label="Access variable R|/x|"]; + 152 [label="Enter safe call"]; + 154 [label="Function call: R|/x|?.R|/A.getA|()"]; + 153 [label="Exit safe call"]; + 155 [label="Const: Null(null)"]; + 156 [label="Operator =="]; + 157 [label="Exit when branch condition"]; } - 156 [label="Synthetic else branch"]; - 157 [label="Enter when branch result"]; + 164 [label="Synthetic else branch"]; + 158 [label="Enter when branch result"]; subgraph cluster_48 { color=blue - 158 [label="Enter block"]; - 159 [label="Jump: ^test_4 Unit"]; - 160 [label="Stub" style="filled" fillcolor=gray]; - 161 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 162 [label="Exit when branch result" style="filled" fillcolor=gray]; - 163 [label="Exit when"]; + 163 [label="Exit when branch result" style="filled" fillcolor=gray]; + 149 [label="Exit when"]; } - 164 [label="Access variable R|/x|"]; - 165 [label="Function call: R|/x|.R|/A.foo|()"]; - 166 [label="Exit function test_4" style="filled" fillcolor=red]; + 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 -> {147}; - 147 -> {148}; - 148 -> {149}; - 149 -> {150 152}; + 146 -> {148}; + 148 -> {150}; + 149 -> {165}; 150 -> {151}; - 151 -> {152}; - 152 -> {153}; - 153 -> {154}; - 154 -> {155}; - 155 -> {157 156}; - 156 -> {163}; - 157 -> {158}; + 151 -> {152 153}; + 152 -> {154}; + 153 -> {155}; + 154 -> {153}; + 155 -> {156}; + 156 -> {157}; + 157 -> {158 164}; 158 -> {159}; - 159 -> {166}; - 159 -> {160} [style=dotted]; + 159 -> {160}; + 160 -> {147}; 160 -> {161} [style=dotted]; 161 -> {162} [style=dotted]; 162 -> {163} [style=dotted]; - 163 -> {164}; - 164 -> {165}; + 163 -> {149} [style=dotted]; + 164 -> {149}; 165 -> {166}; + 166 -> {147}; subgraph cluster_49 { color=red 167 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_50 { color=blue - 168 [label="Enter when"]; + 169 [label="Enter when"]; subgraph cluster_51 { color=blue - 169 [label="Enter when branch condition "]; - 170 [label="Access variable R|/q|"]; - 171 [label="Enter safe call"]; - 172 [label="Access variable R|/Q.data|"]; - 173 [label="Exit safe call"]; - 174 [label="Enter safe call"]; - 175 [label="Access variable R|/MyData.s|"]; - 176 [label="Exit safe call"]; - 177 [label="Enter safe call"]; - 178 [label="Function call: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 179 [label="Exit safe call"]; - 180 [label="Const: Null(null)"]; - 181 [label="Operator !="]; - 182 [label="Exit when branch condition"]; + 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: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 180 [label="Exit safe call"]; + 182 [label="Const: Null(null)"]; + 183 [label="Operator !="]; + 184 [label="Exit when branch condition"]; } - 183 [label="Synthetic else branch"]; - 184 [label="Enter when branch result"]; + 198 [label="Synthetic else branch"]; + 185 [label="Enter when branch result"]; subgraph cluster_52 { color=blue - 185 [label="Enter block"]; - 186 [label="Access variable R|/q|"]; - 187 [label="Access variable R|/Q.data|"]; - 188 [label="Access variable R|/q|"]; - 189 [label="Access variable R|/Q.data|"]; - 190 [label="Access variable #"]; - 191 [label="Access variable R|/q|"]; - 192 [label="Access variable R|/Q.data|"]; - 193 [label="Access variable #"]; - 194 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; - 195 [label="Exit block"]; + 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"]; } - 196 [label="Exit when branch result"]; - 197 [label="Exit when"]; + 197 [label="Exit when branch result"]; + 170 [label="Exit when"]; } - 198 [label="Exit function test_5" style="filled" fillcolor=red]; + 168 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 167 -> {168}; - 168 -> {169}; - 169 -> {170}; - 170 -> {171 173}; + 167 -> {169}; + 169 -> {171}; + 170 -> {168}; 171 -> {172}; - 172 -> {173}; - 173 -> {174 176}; - 174 -> {175}; - 175 -> {176}; - 176 -> {177 179}; - 177 -> {178}; - 178 -> {179}; - 179 -> {180}; - 180 -> {181}; - 181 -> {182}; - 182 -> {184 183}; - 183 -> {197}; - 184 -> {185}; + 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}; @@ -591,101 +563,100 @@ digraph nullability_kt { 194 -> {195}; 195 -> {196}; 196 -> {197}; - 197 -> {198}; + 197 -> {170}; + 198 -> {170}; subgraph cluster_53 { color=red 199 [label="Enter function test_6" style="filled" fillcolor=red]; subgraph cluster_54 { color=blue - 200 [label="Enter when"]; - 201 [label="Access variable R|/q|"]; - 202 [label="Enter safe call"]; - 203 [label="Access variable R|/Q.data|"]; - 204 [label="Exit safe call"]; - 205 [label="Enter safe call"]; - 206 [label="Access variable R|/MyData.s|"]; - 207 [label="Exit safe call"]; - 208 [label="Enter safe call"]; - 209 [label="Function call: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 210 [label="Exit safe call"]; - 211 [label="Variable declaration: lval : R|kotlin/Int?|"]; + 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: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 211 [label="Exit safe call"]; + 213 [label="Variable declaration: lval : R|kotlin/Int?|"]; subgraph cluster_55 { color=blue - 212 [label="Enter when branch condition "]; - 213 [label="Const: Null(null)"]; - 214 [label="Operator =="]; - 215 [label="Exit when branch condition"]; + 214 [label="Enter when branch condition "]; + 215 [label="Const: Null(null)"]; + 216 [label="Operator =="]; + 217 [label="Exit when branch condition"]; } subgraph cluster_56 { color=blue - 216 [label="Enter when branch condition else"]; - 217 [label="Exit when branch condition"]; + 224 [label="Enter when branch condition else"]; + 225 [label="Exit when branch condition"]; } - 218 [label="Enter when branch result"]; + 226 [label="Enter when branch result"]; subgraph cluster_57 { color=blue - 219 [label="Enter block"]; - 220 [label="Access variable R|/|"]; - 221 [label="Exit block"]; + 227 [label="Enter block"]; + 228 [label="Access variable R|/|"]; + 229 [label="Exit block"]; } - 222 [label="Exit when branch result"]; - 223 [label="Enter when branch result"]; + 230 [label="Exit when branch result"]; + 218 [label="Enter when branch result"]; subgraph cluster_58 { color=blue - 224 [label="Enter block"]; - 225 [label="Jump: ^test_6 Unit"]; - 226 [label="Stub" style="filled" fillcolor=gray]; - 227 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 228 [label="Exit when branch result" style="filled" fillcolor=gray]; - 229 [label="Exit when"]; + 223 [label="Exit when branch result" style="filled" fillcolor=gray]; + 202 [label="Exit when"]; } - 230 [label="Access variable R|/q|"]; - 231 [label="Access variable R|/Q.data|"]; - 232 [label="Access variable R|/q|"]; - 233 [label="Access variable R|/Q.data|"]; - 234 [label="Access variable #"]; - 235 [label="Access variable R|/q|"]; - 236 [label="Access variable R|/Q.data|"]; - 237 [label="Access variable #"]; - 238 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; - 239 [label="Exit function test_6" style="filled" fillcolor=red]; + 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]; } - - 199 -> {200}; - 200 -> {201}; - 201 -> {202 204}; - 202 -> {203}; - 203 -> {204}; - 204 -> {205 207}; - 205 -> {206}; - 206 -> {207}; - 207 -> {208 210}; - 208 -> {209}; - 209 -> {210}; - 210 -> {211}; - 211 -> {212}; - 212 -> {213}; + 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 -> {223 216}; + 215 -> {216}; 216 -> {217}; - 217 -> {218}; + 217 -> {218 224}; 218 -> {219}; 219 -> {220}; - 220 -> {221}; - 221 -> {222}; - 222 -> {229}; - 223 -> {224}; + 220 -> {200}; + 220 -> {221} [style=dotted]; + 221 -> {222} [style=dotted]; + 222 -> {223} [style=dotted]; + 223 -> {202} [style=dotted]; 224 -> {225}; - 225 -> {239}; - 225 -> {226} [style=dotted]; - 226 -> {227} [style=dotted]; - 227 -> {228} [style=dotted]; - 228 -> {229} [style=dotted]; + 225 -> {226}; + 226 -> {227}; + 227 -> {228}; + 228 -> {229}; 229 -> {230}; - 230 -> {231}; + 230 -> {202}; 231 -> {232}; 232 -> {233}; 233 -> {234}; @@ -694,70 +665,69 @@ digraph nullability_kt { 236 -> {237}; 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 - 241 [label="Enter when"]; + 242 [label="Enter when"]; subgraph cluster_61 { color=blue - 242 [label="Enter when branch condition "]; - 243 [label="Access variable R|/q|"]; - 244 [label="Enter safe call"]; - 245 [label="Function call: R|/q|?.R|/Q.fdata|()"]; - 246 [label="Exit safe call"]; - 247 [label="Enter safe call"]; - 248 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()"]; - 249 [label="Exit safe call"]; - 250 [label="Enter safe call"]; - 251 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()?.R|kotlin/Int.inc|()"]; - 252 [label="Exit safe call"]; - 253 [label="Const: Null(null)"]; - 254 [label="Operator !="]; - 255 [label="Exit when branch condition"]; + 244 [label="Enter when branch condition "]; + 245 [label="Access variable R|/q|"]; + 246 [label="Enter safe call"]; + 248 [label="Function call: R|/q|?.R|/Q.fdata|()"]; + 247 [label="Exit safe call"]; + 249 [label="Enter safe call"]; + 251 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()"]; + 250 [label="Exit safe call"]; + 252 [label="Enter safe call"]; + 254 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()?.R|kotlin/Int.inc|()"]; + 253 [label="Exit safe call"]; + 255 [label="Const: Null(null)"]; + 256 [label="Operator !="]; + 257 [label="Exit when branch condition"]; } - 256 [label="Synthetic else branch"]; - 257 [label="Enter when branch result"]; + 271 [label="Synthetic else branch"]; + 258 [label="Enter when branch result"]; subgraph cluster_62 { color=blue - 258 [label="Enter block"]; - 259 [label="Access variable R|/q|"]; - 260 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 261 [label="Access variable R|/q|"]; - 262 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 263 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; - 264 [label="Access variable R|/q|"]; - 265 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 266 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; - 267 [label="Function call: R|/q|.R|/Q.fdata|().#().#()"]; - 268 [label="Exit block"]; + 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"]; } - 269 [label="Exit when branch result"]; - 270 [label="Exit when"]; + 270 [label="Exit when branch result"]; + 243 [label="Exit when"]; } - 271 [label="Exit function test_7" style="filled" fillcolor=red]; + 241 [label="Exit function test_7" style="filled" fillcolor=red]; } - - 240 -> {241}; - 241 -> {242}; - 242 -> {243}; - 243 -> {244 246}; + 240 -> {242}; + 242 -> {244}; + 243 -> {241}; 244 -> {245}; - 245 -> {246}; - 246 -> {247 249}; - 247 -> {248}; - 248 -> {249}; - 249 -> {250 252}; - 250 -> {251}; - 251 -> {252}; - 252 -> {253}; - 253 -> {254}; - 254 -> {255}; - 255 -> {257 256}; - 256 -> {270}; - 257 -> {258}; + 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}; @@ -770,498 +740,494 @@ digraph nullability_kt { 267 -> {268}; 268 -> {269}; 269 -> {270}; - 270 -> {271}; + 270 -> {243}; + 271 -> {243}; subgraph cluster_63 { color=red 272 [label="Enter function test_8" style="filled" fillcolor=red]; subgraph cluster_64 { color=blue - 273 [label="Enter when"]; + 274 [label="Enter when"]; subgraph cluster_65 { color=blue - 274 [label="Enter when branch condition "]; - 275 [label="Access variable R|/b|"]; - 276 [label="Const: Boolean(true)"]; - 277 [label="Operator =="]; - 278 [label="Exit when branch condition"]; + 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"]; } - 279 [label="Synthetic else branch"]; - 280 [label="Enter when branch result"]; + 287 [label="Synthetic else branch"]; + 281 [label="Enter when branch result"]; subgraph cluster_66 { color=blue - 281 [label="Enter block"]; - 282 [label="Access variable R|/b|"]; - 283 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 284 [label="Exit block"]; + 282 [label="Enter block"]; + 283 [label="Access variable R|/b|"]; + 284 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 285 [label="Exit block"]; } - 285 [label="Exit when branch result"]; - 286 [label="Exit when"]; + 286 [label="Exit when branch result"]; + 275 [label="Exit when"]; } - 287 [label="Exit function test_8" style="filled" fillcolor=red]; + 273 [label="Exit function test_8" style="filled" fillcolor=red]; } - - 272 -> {273}; - 273 -> {274}; - 274 -> {275}; - 275 -> {276}; + 272 -> {274}; + 274 -> {276}; + 275 -> {273}; 276 -> {277}; 277 -> {278}; - 278 -> {280 279}; - 279 -> {286}; - 280 -> {281}; + 278 -> {279}; + 279 -> {280}; + 280 -> {281 287}; 281 -> {282}; 282 -> {283}; 283 -> {284}; 284 -> {285}; 285 -> {286}; - 286 -> {287}; + 286 -> {275}; + 287 -> {275}; subgraph cluster_67 { color=red 288 [label="Enter function test_9" style="filled" fillcolor=red]; subgraph cluster_68 { color=blue - 289 [label="Enter when"]; + 290 [label="Enter when"]; subgraph cluster_69 { color=blue - 290 [label="Enter when branch condition "]; - 291 [label="Access variable R|/a|"]; - 292 [label="Access variable R|/b|"]; - 293 [label="Operator =="]; - 294 [label="Exit when branch condition"]; + 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"]; } - 295 [label="Synthetic else branch"]; - 296 [label="Enter when branch result"]; + 303 [label="Synthetic else branch"]; + 297 [label="Enter when branch result"]; subgraph cluster_70 { color=blue - 297 [label="Enter block"]; - 298 [label="Access variable R|/b|"]; - 299 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 300 [label="Exit block"]; + 298 [label="Enter block"]; + 299 [label="Access variable R|/b|"]; + 300 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 301 [label="Exit block"]; } - 301 [label="Exit when branch result"]; - 302 [label="Exit when"]; + 302 [label="Exit when branch result"]; + 291 [label="Exit when"]; } - 303 [label="Access variable R|/b|"]; - 304 [label="Function call: R|/b|.#()"]; + 304 [label="Access variable R|/b|"]; + 305 [label="Function call: R|/b|.#()"]; subgraph cluster_71 { color=blue - 305 [label="Enter when"]; + 306 [label="Enter when"]; subgraph cluster_72 { color=blue - 306 [label="Enter when branch condition "]; - 307 [label="Access variable R|/a|"]; - 308 [label="Access variable R|/b|"]; - 309 [label="Operator ==="]; - 310 [label="Exit when branch condition"]; + 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"]; } - 311 [label="Synthetic else branch"]; - 312 [label="Enter when branch result"]; + 319 [label="Synthetic else branch"]; + 313 [label="Enter when branch result"]; subgraph cluster_73 { color=blue - 313 [label="Enter block"]; - 314 [label="Access variable R|/b|"]; - 315 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 316 [label="Exit block"]; + 314 [label="Enter block"]; + 315 [label="Access variable R|/b|"]; + 316 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 317 [label="Exit block"]; } - 317 [label="Exit when branch result"]; - 318 [label="Exit when"]; + 318 [label="Exit when branch result"]; + 307 [label="Exit when"]; } - 319 [label="Access variable R|/b|"]; - 320 [label="Function call: R|/b|.#()"]; + 320 [label="Access variable R|/b|"]; + 321 [label="Function call: R|/b|.#()"]; subgraph cluster_74 { color=blue - 321 [label="Enter when"]; + 322 [label="Enter when"]; subgraph cluster_75 { color=blue - 322 [label="Enter when branch condition "]; - 323 [label="Access variable R|/b|"]; - 324 [label="Access variable R|/a|"]; - 325 [label="Operator =="]; - 326 [label="Exit when branch condition"]; + 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"]; } - 327 [label="Synthetic else branch"]; - 328 [label="Enter when branch result"]; + 335 [label="Synthetic else branch"]; + 329 [label="Enter when branch result"]; subgraph cluster_76 { color=blue - 329 [label="Enter block"]; - 330 [label="Access variable R|/b|"]; - 331 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 332 [label="Exit block"]; + 330 [label="Enter block"]; + 331 [label="Access variable R|/b|"]; + 332 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 333 [label="Exit block"]; } - 333 [label="Exit when branch result"]; - 334 [label="Exit when"]; + 334 [label="Exit when branch result"]; + 323 [label="Exit when"]; } - 335 [label="Access variable R|/b|"]; - 336 [label="Function call: R|/b|.#()"]; + 336 [label="Access variable R|/b|"]; + 337 [label="Function call: R|/b|.#()"]; subgraph cluster_77 { color=blue - 337 [label="Enter when"]; + 338 [label="Enter when"]; subgraph cluster_78 { color=blue - 338 [label="Enter when branch condition "]; - 339 [label="Access variable R|/b|"]; - 340 [label="Access variable R|/a|"]; - 341 [label="Operator ==="]; - 342 [label="Exit when branch condition"]; + 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"]; } - 343 [label="Synthetic else branch"]; - 344 [label="Enter when branch result"]; + 351 [label="Synthetic else branch"]; + 345 [label="Enter when branch result"]; subgraph cluster_79 { color=blue - 345 [label="Enter block"]; - 346 [label="Access variable R|/b|"]; - 347 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 348 [label="Exit block"]; + 346 [label="Enter block"]; + 347 [label="Access variable R|/b|"]; + 348 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 349 [label="Exit block"]; } - 349 [label="Exit when branch result"]; - 350 [label="Exit when"]; + 350 [label="Exit when branch result"]; + 339 [label="Exit when"]; } - 351 [label="Access variable R|/b|"]; - 352 [label="Function call: R|/b|.#()"]; - 353 [label="Exit function test_9" style="filled" fillcolor=red]; + 352 [label="Access variable R|/b|"]; + 353 [label="Function call: R|/b|.#()"]; + 289 [label="Exit function test_9" style="filled" fillcolor=red]; } - - 288 -> {289}; - 289 -> {290}; - 290 -> {291}; - 291 -> {292}; + 288 -> {290}; + 290 -> {292}; + 291 -> {304}; 292 -> {293}; 293 -> {294}; - 294 -> {296 295}; - 295 -> {302}; - 296 -> {297}; + 294 -> {295}; + 295 -> {296}; + 296 -> {297 303}; 297 -> {298}; 298 -> {299}; 299 -> {300}; 300 -> {301}; 301 -> {302}; - 302 -> {303}; - 303 -> {304}; + 302 -> {291}; + 303 -> {291}; 304 -> {305}; 305 -> {306}; - 306 -> {307}; - 307 -> {308}; + 306 -> {308}; + 307 -> {320}; 308 -> {309}; 309 -> {310}; - 310 -> {312 311}; - 311 -> {318}; - 312 -> {313}; + 310 -> {311}; + 311 -> {312}; + 312 -> {313 319}; 313 -> {314}; 314 -> {315}; 315 -> {316}; 316 -> {317}; 317 -> {318}; - 318 -> {319}; - 319 -> {320}; + 318 -> {307}; + 319 -> {307}; 320 -> {321}; 321 -> {322}; - 322 -> {323}; - 323 -> {324}; + 322 -> {324}; + 323 -> {336}; 324 -> {325}; 325 -> {326}; - 326 -> {328 327}; - 327 -> {334}; - 328 -> {329}; + 326 -> {327}; + 327 -> {328}; + 328 -> {329 335}; 329 -> {330}; 330 -> {331}; 331 -> {332}; 332 -> {333}; 333 -> {334}; - 334 -> {335}; - 335 -> {336}; + 334 -> {323}; + 335 -> {323}; 336 -> {337}; 337 -> {338}; - 338 -> {339}; - 339 -> {340}; + 338 -> {340}; + 339 -> {352}; 340 -> {341}; 341 -> {342}; - 342 -> {344 343}; - 343 -> {350}; - 344 -> {345}; + 342 -> {343}; + 343 -> {344}; + 344 -> {345 351}; 345 -> {346}; 346 -> {347}; 347 -> {348}; 348 -> {349}; 349 -> {350}; - 350 -> {351}; - 351 -> {352}; + 350 -> {339}; + 351 -> {339}; 352 -> {353}; + 353 -> {289}; subgraph cluster_80 { color=red 354 [label="Enter function test_10" style="filled" fillcolor=red]; subgraph cluster_81 { color=blue - 355 [label="Enter when"]; + 356 [label="Enter when"]; subgraph cluster_82 { color=blue - 356 [label="Enter when branch condition "]; - 357 [label="Access variable R|/a|"]; - 358 [label="Access variable R|/b|"]; - 359 [label="Operator =="]; - 360 [label="Exit when branch condition"]; + 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"]; } - 361 [label="Synthetic else branch"]; - 362 [label="Enter when branch result"]; + 369 [label="Synthetic else branch"]; + 363 [label="Enter when branch result"]; subgraph cluster_83 { color=blue - 363 [label="Enter block"]; - 364 [label="Access variable R|/b|"]; - 365 [label="Function call: R|/b|.#()"]; - 366 [label="Exit block"]; + 364 [label="Enter block"]; + 365 [label="Access variable R|/b|"]; + 366 [label="Function call: R|/b|.#()"]; + 367 [label="Exit block"]; } - 367 [label="Exit when branch result"]; - 368 [label="Exit when"]; + 368 [label="Exit when branch result"]; + 357 [label="Exit when"]; } - 369 [label="Access variable R|/b|"]; - 370 [label="Function call: R|/b|.#()"]; + 370 [label="Access variable R|/b|"]; + 371 [label="Function call: R|/b|.#()"]; subgraph cluster_84 { color=blue - 371 [label="Enter when"]; + 372 [label="Enter when"]; subgraph cluster_85 { color=blue - 372 [label="Enter when branch condition "]; - 373 [label="Access variable R|/a|"]; - 374 [label="Access variable R|/b|"]; - 375 [label="Operator ==="]; - 376 [label="Exit when branch condition"]; + 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"]; } - 377 [label="Synthetic else branch"]; - 378 [label="Enter when branch result"]; + 385 [label="Synthetic else branch"]; + 379 [label="Enter when branch result"]; subgraph cluster_86 { color=blue - 379 [label="Enter block"]; - 380 [label="Access variable R|/b|"]; - 381 [label="Function call: R|/b|.#()"]; - 382 [label="Exit block"]; + 380 [label="Enter block"]; + 381 [label="Access variable R|/b|"]; + 382 [label="Function call: R|/b|.#()"]; + 383 [label="Exit block"]; } - 383 [label="Exit when branch result"]; - 384 [label="Exit when"]; + 384 [label="Exit when branch result"]; + 373 [label="Exit when"]; } - 385 [label="Access variable R|/b|"]; - 386 [label="Function call: R|/b|.#()"]; + 386 [label="Access variable R|/b|"]; + 387 [label="Function call: R|/b|.#()"]; subgraph cluster_87 { color=blue - 387 [label="Enter when"]; + 388 [label="Enter when"]; subgraph cluster_88 { color=blue - 388 [label="Enter when branch condition "]; - 389 [label="Access variable R|/b|"]; - 390 [label="Access variable R|/a|"]; - 391 [label="Operator =="]; - 392 [label="Exit when branch condition"]; + 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"]; } - 393 [label="Synthetic else branch"]; - 394 [label="Enter when branch result"]; + 401 [label="Synthetic else branch"]; + 395 [label="Enter when branch result"]; subgraph cluster_89 { color=blue - 395 [label="Enter block"]; - 396 [label="Access variable R|/b|"]; - 397 [label="Function call: R|/b|.#()"]; - 398 [label="Exit block"]; + 396 [label="Enter block"]; + 397 [label="Access variable R|/b|"]; + 398 [label="Function call: R|/b|.#()"]; + 399 [label="Exit block"]; } - 399 [label="Exit when branch result"]; - 400 [label="Exit when"]; + 400 [label="Exit when branch result"]; + 389 [label="Exit when"]; } - 401 [label="Access variable R|/b|"]; - 402 [label="Function call: R|/b|.#()"]; + 402 [label="Access variable R|/b|"]; + 403 [label="Function call: R|/b|.#()"]; subgraph cluster_90 { color=blue - 403 [label="Enter when"]; + 404 [label="Enter when"]; subgraph cluster_91 { color=blue - 404 [label="Enter when branch condition "]; - 405 [label="Access variable R|/b|"]; - 406 [label="Access variable R|/a|"]; - 407 [label="Operator ==="]; - 408 [label="Exit when branch condition"]; + 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"]; } - 409 [label="Synthetic else branch"]; - 410 [label="Enter when branch result"]; + 417 [label="Synthetic else branch"]; + 411 [label="Enter when branch result"]; subgraph cluster_92 { color=blue - 411 [label="Enter block"]; - 412 [label="Access variable R|/b|"]; - 413 [label="Function call: R|/b|.#()"]; - 414 [label="Exit block"]; + 412 [label="Enter block"]; + 413 [label="Access variable R|/b|"]; + 414 [label="Function call: R|/b|.#()"]; + 415 [label="Exit block"]; } - 415 [label="Exit when branch result"]; - 416 [label="Exit when"]; + 416 [label="Exit when branch result"]; + 405 [label="Exit when"]; } - 417 [label="Access variable R|/b|"]; - 418 [label="Function call: R|/b|.#()"]; - 419 [label="Exit function test_10" style="filled" fillcolor=red]; + 418 [label="Access variable R|/b|"]; + 419 [label="Function call: R|/b|.#()"]; + 355 [label="Exit function test_10" style="filled" fillcolor=red]; } - - 354 -> {355}; - 355 -> {356}; - 356 -> {357}; - 357 -> {358}; + 354 -> {356}; + 356 -> {358}; + 357 -> {370}; 358 -> {359}; 359 -> {360}; - 360 -> {362 361}; - 361 -> {368}; - 362 -> {363}; + 360 -> {361}; + 361 -> {362}; + 362 -> {363 369}; 363 -> {364}; 364 -> {365}; 365 -> {366}; 366 -> {367}; 367 -> {368}; - 368 -> {369}; - 369 -> {370}; + 368 -> {357}; + 369 -> {357}; 370 -> {371}; 371 -> {372}; - 372 -> {373}; - 373 -> {374}; + 372 -> {374}; + 373 -> {386}; 374 -> {375}; 375 -> {376}; - 376 -> {378 377}; - 377 -> {384}; - 378 -> {379}; + 376 -> {377}; + 377 -> {378}; + 378 -> {379 385}; 379 -> {380}; 380 -> {381}; 381 -> {382}; 382 -> {383}; 383 -> {384}; - 384 -> {385}; - 385 -> {386}; + 384 -> {373}; + 385 -> {373}; 386 -> {387}; 387 -> {388}; - 388 -> {389}; - 389 -> {390}; + 388 -> {390}; + 389 -> {402}; 390 -> {391}; 391 -> {392}; - 392 -> {394 393}; - 393 -> {400}; - 394 -> {395}; + 392 -> {393}; + 393 -> {394}; + 394 -> {395 401}; 395 -> {396}; 396 -> {397}; 397 -> {398}; 398 -> {399}; 399 -> {400}; - 400 -> {401}; - 401 -> {402}; + 400 -> {389}; + 401 -> {389}; 402 -> {403}; 403 -> {404}; - 404 -> {405}; - 405 -> {406}; + 404 -> {406}; + 405 -> {418}; 406 -> {407}; 407 -> {408}; - 408 -> {410 409}; - 409 -> {416}; - 410 -> {411}; + 408 -> {409}; + 409 -> {410}; + 410 -> {411 417}; 411 -> {412}; 412 -> {413}; 413 -> {414}; 414 -> {415}; 415 -> {416}; - 416 -> {417}; - 417 -> {418}; + 416 -> {405}; + 417 -> {405}; 418 -> {419}; + 419 -> {355}; subgraph cluster_93 { color=red 420 [label="Enter function test_11" style="filled" fillcolor=red]; subgraph cluster_94 { color=blue - 421 [label="Enter when"]; + 422 [label="Enter when"]; subgraph cluster_95 { color=blue - 422 [label="Enter when branch condition "]; - 423 [label="Access variable R|/q|"]; - 424 [label="Enter safe call"]; - 425 [label="Access variable R|/QImpl.data|"]; - 426 [label="Exit safe call"]; - 427 [label="Enter safe call"]; - 428 [label="Access variable R|/MyData.s|"]; - 429 [label="Exit safe call"]; - 430 [label="Enter safe call"]; - 431 [label="Function call: R|/q|?.R|/QImpl.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 432 [label="Exit safe call"]; - 433 [label="Const: Null(null)"]; - 434 [label="Operator !="]; - 435 [label="Exit when branch condition"]; + 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: R|/q|?.R|/QImpl.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 433 [label="Exit safe call"]; + 435 [label="Const: Null(null)"]; + 436 [label="Operator !="]; + 437 [label="Exit when branch condition"]; } - 436 [label="Synthetic else branch"]; - 437 [label="Enter when branch result"]; + 480 [label="Synthetic else branch"]; + 438 [label="Enter when branch result"]; subgraph cluster_96 { color=blue - 438 [label="Enter block"]; - 439 [label="Access variable R|/q|"]; - 440 [label="Access variable R|/QImpl.data|"]; - 441 [label="Access variable R|/q|"]; - 442 [label="Access variable R|/QImpl.data|"]; - 443 [label="Access variable R|/MyData.s|"]; - 444 [label="Access variable R|/q|"]; - 445 [label="Access variable R|/QImpl.data|"]; - 446 [label="Access variable R|/MyData.s|"]; - 447 [label="Function call: R|/q|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; - 448 [label="Access variable R|/q2|"]; - 449 [label="Access variable R|/QImpl.data|"]; - 450 [label="Access variable R|/q2|"]; - 451 [label="Access variable R|/QImpl.data|"]; - 452 [label="Access variable #"]; - 453 [label="Access variable R|/q2|"]; - 454 [label="Access variable R|/QImpl.data|"]; - 455 [label="Access variable #"]; - 456 [label="Function call: R|/q2|.R|/QImpl.data|.#.#()"]; + 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 - 457 [label="Enter when"]; + 458 [label="Enter when"]; subgraph cluster_98 { color=blue - 458 [label="Enter when branch condition "]; - 459 [label="Access variable R|/q2|"]; - 460 [label="Access variable R|/QImpl.data|"]; - 461 [label="Const: Null(null)"]; - 462 [label="Operator !="]; - 463 [label="Exit when branch condition"]; + 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"]; } - 464 [label="Synthetic else branch"]; - 465 [label="Enter when branch result"]; + 477 [label="Synthetic else branch"]; + 466 [label="Enter when branch result"]; subgraph cluster_99 { color=blue - 466 [label="Enter block"]; - 467 [label="Access variable R|/q2|"]; - 468 [label="Access variable R|/QImpl.data|"]; - 469 [label="Access variable R|/MyData.s|"]; - 470 [label="Access variable R|/q2|"]; - 471 [label="Access variable R|/QImpl.data|"]; - 472 [label="Access variable R|/MyData.s|"]; - 473 [label="Function call: R|/q2|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; - 474 [label="Exit block"]; + 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"]; } - 475 [label="Exit when branch result"]; - 476 [label="Exit when"]; + 476 [label="Exit when branch result"]; + 459 [label="Exit when"]; } - 477 [label="Exit block"]; + 478 [label="Exit block"]; } - 478 [label="Exit when branch result"]; - 479 [label="Exit when"]; + 479 [label="Exit when branch result"]; + 423 [label="Exit when"]; } - 480 [label="Exit function test_11" style="filled" fillcolor=red]; + 421 [label="Exit function test_11" style="filled" fillcolor=red]; } - - 420 -> {421}; - 421 -> {422}; - 422 -> {423}; - 423 -> {424 426}; + 420 -> {422}; + 422 -> {424}; + 423 -> {421}; 424 -> {425}; - 425 -> {426}; - 426 -> {427 429}; - 427 -> {428}; - 428 -> {429}; - 429 -> {430 432}; - 430 -> {431}; - 431 -> {432}; - 432 -> {433}; - 433 -> {434}; - 434 -> {435}; - 435 -> {437 436}; - 436 -> {479}; - 437 -> {438}; + 425 -> {426 427}; + 426 -> {428}; + 427 -> {429 430}; + 428 -> {427}; + 429 -> {431}; + 430 -> {432 433}; + 431 -> {430}; + 432 -> {434}; + 433 -> {435}; + 434 -> {433}; + 435 -> {436}; + 436 -> {437}; + 437 -> {438 480}; 438 -> {439}; 439 -> {440}; 440 -> {441}; @@ -1282,14 +1248,14 @@ digraph nullability_kt { 455 -> {456}; 456 -> {457}; 457 -> {458}; - 458 -> {459}; - 459 -> {460}; + 458 -> {460}; + 459 -> {478}; 460 -> {461}; 461 -> {462}; 462 -> {463}; - 463 -> {465 464}; - 464 -> {476}; - 465 -> {466}; + 463 -> {464}; + 464 -> {465}; + 465 -> {466 477}; 466 -> {467}; 467 -> {468}; 468 -> {469}; @@ -1300,74 +1266,73 @@ digraph nullability_kt { 473 -> {474}; 474 -> {475}; 475 -> {476}; - 476 -> {477}; - 477 -> {478}; + 476 -> {459}; + 477 -> {459}; 478 -> {479}; - 479 -> {480}; + 479 -> {423}; + 480 -> {423}; subgraph cluster_100 { color=red 481 [label="Enter function test_12" style="filled" fillcolor=red]; subgraph cluster_101 { color=blue - 482 [label="Enter when"]; + 483 [label="Enter when"]; subgraph cluster_102 { color=blue - 483 [label="Enter when branch condition "]; - 484 [label="Access variable R|/q|"]; - 485 [label="Enter safe call"]; - 486 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 487 [label="Exit safe call"]; - 488 [label="Enter safe call"]; - 489 [label="Access variable R|/MyData.s|"]; - 490 [label="Exit safe call"]; - 491 [label="Enter safe call"]; - 492 [label="Function call: R|/q|?.R|/QImplWithCustomGetter.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 493 [label="Exit safe call"]; - 494 [label="Const: Null(null)"]; - 495 [label="Operator !="]; - 496 [label="Exit when branch condition"]; + 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: R|/q|?.R|/QImplWithCustomGetter.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 494 [label="Exit safe call"]; + 496 [label="Const: Null(null)"]; + 497 [label="Operator !="]; + 498 [label="Exit when branch condition"]; } - 497 [label="Synthetic else branch"]; - 498 [label="Enter when branch result"]; + 512 [label="Synthetic else branch"]; + 499 [label="Enter when branch result"]; subgraph cluster_103 { color=blue - 499 [label="Enter block"]; - 500 [label="Access variable R|/q|"]; - 501 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 502 [label="Access variable R|/q|"]; - 503 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 504 [label="Access variable #"]; - 505 [label="Access variable R|/q|"]; - 506 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 507 [label="Access variable #"]; - 508 [label="Function call: R|/q|.R|/QImplWithCustomGetter.data|.#.#()"]; - 509 [label="Exit block"]; + 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"]; } - 510 [label="Exit when branch result"]; - 511 [label="Exit when"]; + 511 [label="Exit when branch result"]; + 484 [label="Exit when"]; } - 512 [label="Exit function test_12" style="filled" fillcolor=red]; + 482 [label="Exit function test_12" style="filled" fillcolor=red]; } - - 481 -> {482}; - 482 -> {483}; - 483 -> {484}; - 484 -> {485 487}; + 481 -> {483}; + 483 -> {485}; + 484 -> {482}; 485 -> {486}; - 486 -> {487}; - 487 -> {488 490}; - 488 -> {489}; - 489 -> {490}; - 490 -> {491 493}; - 491 -> {492}; - 492 -> {493}; - 493 -> {494}; - 494 -> {495}; - 495 -> {496}; - 496 -> {498 497}; - 497 -> {511}; - 498 -> {499}; + 486 -> {487 488}; + 487 -> {489}; + 488 -> {490 491}; + 489 -> {488}; + 490 -> {492}; + 491 -> {493 494}; + 492 -> {491}; + 493 -> {495}; + 494 -> {496}; + 495 -> {494}; + 496 -> {497}; + 497 -> {498}; + 498 -> {499 512}; 499 -> {500}; 500 -> {501}; 501 -> {502}; @@ -1380,71 +1345,70 @@ digraph nullability_kt { 508 -> {509}; 509 -> {510}; 510 -> {511}; - 511 -> {512}; + 511 -> {484}; + 512 -> {484}; subgraph cluster_104 { color=red 513 [label="Enter function test_13" style="filled" fillcolor=red]; subgraph cluster_105 { color=blue - 514 [label="Enter when"]; + 515 [label="Enter when"]; subgraph cluster_106 { color=blue - 515 [label="Enter when branch condition "]; - 516 [label="Access variable R|/q|"]; - 517 [label="Enter safe call"]; - 518 [label="Access variable R|/QImplMutable.data|"]; - 519 [label="Exit safe call"]; - 520 [label="Enter safe call"]; - 521 [label="Access variable R|/MyData.s|"]; - 522 [label="Exit safe call"]; - 523 [label="Enter safe call"]; - 524 [label="Function call: R|/q|?.R|/QImplMutable.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 525 [label="Exit safe call"]; - 526 [label="Const: Null(null)"]; - 527 [label="Operator !="]; - 528 [label="Exit when branch condition"]; + 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: R|/q|?.R|/QImplMutable.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 526 [label="Exit safe call"]; + 528 [label="Const: Null(null)"]; + 529 [label="Operator !="]; + 530 [label="Exit when branch condition"]; } - 529 [label="Synthetic else branch"]; - 530 [label="Enter when branch result"]; + 544 [label="Synthetic else branch"]; + 531 [label="Enter when branch result"]; subgraph cluster_107 { color=blue - 531 [label="Enter block"]; - 532 [label="Access variable R|/q|"]; - 533 [label="Access variable R|/QImplMutable.data|"]; - 534 [label="Access variable R|/q|"]; - 535 [label="Access variable R|/QImplMutable.data|"]; - 536 [label="Access variable #"]; - 537 [label="Access variable R|/q|"]; - 538 [label="Access variable R|/QImplMutable.data|"]; - 539 [label="Access variable #"]; - 540 [label="Function call: R|/q|.R|/QImplMutable.data|.#.#()"]; - 541 [label="Exit block"]; + 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"]; } - 542 [label="Exit when branch result"]; - 543 [label="Exit when"]; + 543 [label="Exit when branch result"]; + 516 [label="Exit when"]; } - 544 [label="Exit function test_13" style="filled" fillcolor=red]; + 514 [label="Exit function test_13" style="filled" fillcolor=red]; } - - 513 -> {514}; - 514 -> {515}; - 515 -> {516}; - 516 -> {517 519}; + 513 -> {515}; + 515 -> {517}; + 516 -> {514}; 517 -> {518}; - 518 -> {519}; - 519 -> {520 522}; - 520 -> {521}; - 521 -> {522}; - 522 -> {523 525}; - 523 -> {524}; - 524 -> {525}; - 525 -> {526}; - 526 -> {527}; - 527 -> {528}; - 528 -> {530 529}; - 529 -> {543}; - 530 -> {531}; + 518 -> {519 520}; + 519 -> {521}; + 520 -> {522 523}; + 521 -> {520}; + 522 -> {524}; + 523 -> {525 526}; + 524 -> {523}; + 525 -> {527}; + 526 -> {528}; + 527 -> {526}; + 528 -> {529}; + 529 -> {530}; + 530 -> {531 544}; 531 -> {532}; 532 -> {533}; 533 -> {534}; @@ -1457,6 +1421,7 @@ digraph nullability_kt { 540 -> {541}; 541 -> {542}; 542 -> {543}; - 543 -> {544}; + 543 -> {516}; + 544 -> {516}; } 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 82fcb2b3ad5..78610c32f17 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,53 @@ digraph implicitReceiverAsWhenSubject_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 1 [label="Enter when"]; - 2 [label="Access variable this@R|/test_1|"]; + 2 [label="Enter when"]; + 4 [label="Access variable this@R|/test_1|"]; subgraph cluster_2 { color=blue - 3 [label="Enter when branch condition "]; - 4 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"]; - 5 [label="Exit when branch condition"]; + 5 [label="Enter when branch condition "]; + 6 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"]; + 7 [label="Exit when branch condition"]; } subgraph cluster_3 { color=blue - 6 [label="Enter when branch condition "]; - 7 [label="Type operator: ($subj$ is R|kotlin/String|)"]; - 8 [label="Exit when branch condition"]; + 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 - 9 [label="Enter when branch condition else"]; - 10 [label="Exit when branch condition"]; + 22 [label="Enter when branch condition else"]; + 23 [label="Exit when branch condition"]; } - 11 [label="Enter when branch result"]; + 24 [label="Enter when branch result"]; subgraph cluster_5 { color=blue - 12 [label="Enter block"]; - 13 [label="Const: Int(0)"]; - 14 [label="Exit block"]; + 25 [label="Enter block"]; + 26 [label="Const: Int(0)"]; + 27 [label="Exit block"]; } - 15 [label="Exit when branch result"]; - 16 [label="Enter when branch result"]; + 28 [label="Exit when branch result"]; + 17 [label="Enter when branch result"]; subgraph cluster_6 { color=blue - 17 [label="Enter block"]; - 18 [label="Access variable R|kotlin/String.length|"]; - 19 [label="Exit block"]; + 18 [label="Enter block"]; + 19 [label="Access variable R|kotlin/String.length|"]; + 20 [label="Exit block"]; } - 20 [label="Exit when branch result"]; - 21 [label="Enter when branch result"]; + 21 [label="Exit when branch result"]; + 8 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 22 [label="Enter block"]; - 23 [label="Access variable this@R|/test_1|"]; - 24 [label="Access variable R|kotlin/collections/List.size|"]; - 25 [label="Exit block"]; + 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"]; } - 26 [label="Exit when branch result"]; - 27 [label="Exit when"]; + 13 [label="Exit when branch result"]; + 3 [label="Exit when"]; } - 28 [label="Jump: ^test_1 when (this@R|/test_1|) { + 29 [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,99 +66,98 @@ digraph implicitReceiverAsWhenSubject_kt { } } "]; - 29 [label="Stub" style="filled" fillcolor=gray]; - 30 [label="Exit function test_1" style="filled" fillcolor=red]; + 30 [label="Stub" style="filled" fillcolor=gray]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {3}; - 3 -> {4}; + 0 -> {2}; + 2 -> {4}; + 3 -> {29}; 4 -> {5}; - 5 -> {21 6}; + 5 -> {6}; 6 -> {7}; - 7 -> {8}; - 8 -> {16 9}; + 7 -> {8 14}; + 8 -> {9}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {14}; + 13 -> {3}; 14 -> {15}; - 15 -> {27}; - 16 -> {17}; + 15 -> {16}; + 16 -> {17 22}; 17 -> {18}; 18 -> {19}; 19 -> {20}; - 20 -> {27}; - 21 -> {22}; + 20 -> {21}; + 21 -> {3}; 22 -> {23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {30}; - 28 -> {29} [style=dotted]; + 28 -> {3}; + 29 -> {1}; 29 -> {30} [style=dotted]; + 30 -> {1} [style=dotted]; subgraph cluster_8 { color=red 31 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_9 { color=blue - 32 [label="Enter when"]; - 33 [label="Access variable this@R|/test_2|"]; - 34 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 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 - 35 [label="Enter when branch condition "]; - 36 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"]; - 37 [label="Exit when branch condition"]; + 37 [label="Enter when branch condition "]; + 38 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"]; + 39 [label="Exit when branch condition"]; } subgraph cluster_11 { color=blue - 38 [label="Enter when branch condition "]; - 39 [label="Type operator: ($subj$ is R|kotlin/String|)"]; - 40 [label="Exit when branch condition"]; + 48 [label="Enter when branch condition "]; + 49 [label="Type operator: ($subj$ is R|kotlin/String|)"]; + 50 [label="Exit when branch condition"]; } subgraph cluster_12 { color=blue - 41 [label="Enter when branch condition else"]; - 42 [label="Exit when branch condition"]; + 58 [label="Enter when branch condition else"]; + 59 [label="Exit when branch condition"]; } - 43 [label="Enter when branch result"]; + 60 [label="Enter when branch result"]; subgraph cluster_13 { color=blue - 44 [label="Enter block"]; - 45 [label="Const: Int(0)"]; - 46 [label="Exit block"]; + 61 [label="Enter block"]; + 62 [label="Const: Int(0)"]; + 63 [label="Exit block"]; } - 47 [label="Exit when branch result"]; - 48 [label="Enter when branch result"]; + 64 [label="Exit when branch result"]; + 51 [label="Enter when branch result"]; subgraph cluster_14 { color=blue - 49 [label="Enter block"]; - 50 [label="Access variable R|/x|"]; - 51 [label="Access variable R|kotlin/String.length|"]; - 52 [label="Access variable R|kotlin/String.length|"]; - 53 [label="Exit block"]; + 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"]; } - 54 [label="Exit when branch result"]; - 55 [label="Enter when branch result"]; + 57 [label="Exit when branch result"]; + 40 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 56 [label="Enter block"]; - 57 [label="Access variable R|/x|"]; - 58 [label="Access variable R|kotlin/collections/List.size|"]; - 59 [label="Access variable this@R|/test_2|"]; - 60 [label="Access variable R|kotlin/collections/List.size|"]; - 61 [label="Exit block"]; + 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"]; } - 62 [label="Exit when branch result"]; - 63 [label="Exit when"]; + 47 [label="Exit when branch result"]; + 34 [label="Exit when"]; } - 64 [label="Jump: ^test_2 when (lval x: R|kotlin/Any| = this@R|/test_2|) { + 65 [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| @@ -172,45 +171,44 @@ digraph implicitReceiverAsWhenSubject_kt { } } "]; - 65 [label="Stub" style="filled" fillcolor=gray]; - 66 [label="Exit function test_2" style="filled" fillcolor=red]; + 66 [label="Stub" style="filled" fillcolor=gray]; + 32 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {35}; + 31 -> {33}; + 33 -> {35}; + 34 -> {65}; 35 -> {36}; 36 -> {37}; - 37 -> {55 38}; + 37 -> {38}; 38 -> {39}; - 39 -> {40}; - 40 -> {48 41}; + 39 -> {40 48}; + 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; 44 -> {45}; 45 -> {46}; 46 -> {47}; - 47 -> {63}; + 47 -> {34}; 48 -> {49}; 49 -> {50}; - 50 -> {51}; + 50 -> {51 58}; 51 -> {52}; 52 -> {53}; 53 -> {54}; - 54 -> {63}; + 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {58}; + 57 -> {34}; 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {66}; - 64 -> {65} [style=dotted]; + 64 -> {34}; + 65 -> {32}; 65 -> {66} [style=dotted]; + 66 -> {32} [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 582ea23a072..f2c8ba2757d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot @@ -6,19 +6,17 @@ digraph implicitReceivers_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter function foo" style="filled" fillcolor=red]; 4 [label="Exit function foo" style="filled" fillcolor=red]; } - 3 -> {4}; subgraph cluster_2 { @@ -26,25 +24,22 @@ digraph implicitReceivers_kt { 5 [label="Enter class A" style="filled" fillcolor=red]; 6 [label="Exit class A" style="filled" fillcolor=red]; } - 5 -> {6} [color=green]; subgraph cluster_3 { color=red 7 [label="Enter function " style="filled" fillcolor=red]; - 8 [label="Delegated constructor call: super()"]; - 9 [label="Exit function " style="filled" fillcolor=red]; + 9 [label="Delegated constructor call: super()"]; + 8 [label="Exit function " style="filled" fillcolor=red]; } - - 7 -> {8}; - 8 -> {9}; + 7 -> {9}; + 9 -> {8}; subgraph cluster_4 { color=red 10 [label="Enter function bar" style="filled" fillcolor=red]; 11 [label="Exit function bar" style="filled" fillcolor=red]; } - 10 -> {11}; subgraph cluster_5 { @@ -52,7 +47,6 @@ digraph implicitReceivers_kt { 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 { @@ -60,7 +54,6 @@ digraph implicitReceivers_kt { 14 [label="Enter function with" style="filled" fillcolor=red]; 15 [label="Exit function with" style="filled" fillcolor=red]; } - 14 -> {15}; subgraph cluster_7 { @@ -68,62 +61,60 @@ digraph implicitReceivers_kt { 16 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue - 17 [label="Enter when"]; + 18 [label="Enter when"]; subgraph cluster_9 { color=blue - 18 [label="Enter when branch condition "]; - 19 [label="Access variable this@R|/test_1|"]; - 20 [label="Type operator: (this@R|/test_1| is R|A|)"]; - 21 [label="Exit when branch condition"]; + 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 - 22 [label="Enter when branch condition else"]; - 23 [label="Exit when branch condition"]; + 31 [label="Enter when branch condition else"]; + 32 [label="Exit when branch condition"]; } - 24 [label="Enter when branch result"]; + 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"]; + 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|.#()"]; - 28 [label="Function call: #()"]; + 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"]; } 30 [label="Exit when branch result"]; - 31 [label="Enter when branch result"]; - subgraph cluster_12 { - 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"]; - 38 [label="Exit when"]; + 19 [label="Exit when"]; } - 39 [label="Access variable this@R|/test_1|"]; - 40 [label="Function call: this@R|/test_1|.#()"]; - 41 [label="Function call: #()"]; - 42 [label="Exit function test_1" style="filled" fillcolor=red]; + 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]; } - - 16 -> {17}; - 17 -> {18}; - 18 -> {19}; - 19 -> {20}; + 16 -> {18}; + 18 -> {20}; + 19 -> {40}; 20 -> {21}; - 21 -> {31 22}; + 21 -> {22}; 22 -> {23}; - 23 -> {24}; + 23 -> {24 31}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {38}; + 30 -> {19}; 31 -> {32}; 32 -> {33}; 33 -> {34}; @@ -132,71 +123,70 @@ digraph implicitReceivers_kt { 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {40}; + 39 -> {19}; 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 - 44 [label="Enter when"]; + 45 [label="Enter when"]; subgraph cluster_15 { color=blue - 45 [label="Enter when branch condition "]; - 46 [label="Access variable this@R|/test_2|"]; - 47 [label="Type operator: (this@R|/test_2| !is R|A|)"]; - 48 [label="Exit when branch condition"]; + 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 - 49 [label="Enter when branch condition else"]; - 50 [label="Exit when branch condition"]; + 58 [label="Enter when branch condition else"]; + 59 [label="Exit when branch condition"]; } - 51 [label="Enter when branch result"]; + 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|.R|/A.foo|()"]; - 55 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; + 54 [label="Function call: this@R|/test_2|.#()"]; + 55 [label="Function call: #()"]; 56 [label="Exit block"]; } 57 [label="Exit when branch result"]; - 58 [label="Enter when branch result"]; - subgraph cluster_18 { - color=blue - 59 [label="Enter block"]; - 60 [label="Access variable this@R|/test_2|"]; - 61 [label="Function call: this@R|/test_2|.#()"]; - 62 [label="Function call: #()"]; - 63 [label="Exit block"]; - } - 64 [label="Exit when branch result"]; - 65 [label="Exit when"]; + 46 [label="Exit when"]; } - 66 [label="Access variable this@R|/test_2|"]; - 67 [label="Function call: this@R|/test_2|.#()"]; - 68 [label="Function call: #()"]; - 69 [label="Exit function test_2" style="filled" fillcolor=red]; + 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 -> {44}; - 44 -> {45}; - 45 -> {46}; - 46 -> {47}; + 43 -> {45}; + 45 -> {47}; + 46 -> {67}; 47 -> {48}; - 48 -> {58 49}; + 48 -> {49}; 49 -> {50}; - 50 -> {51}; + 50 -> {51 58}; 51 -> {52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {65}; + 57 -> {46}; 58 -> {59}; 59 -> {60}; 60 -> {61}; @@ -205,209 +195,207 @@ digraph implicitReceivers_kt { 63 -> {64}; 64 -> {65}; 65 -> {66}; - 66 -> {67}; + 66 -> {46}; 67 -> {68}; 68 -> {69}; + 69 -> {44}; subgraph cluster_19 { color=red 70 [label="Enter function test_3" style="filled" fillcolor=red]; - 71 [label="Access variable R|/a|"]; - 72 [label="Postponed enter to lambda"]; + 72 [label="Access variable R|/a|"]; + 73 [label="Postponed enter to lambda"]; subgraph cluster_20 { color=blue - 73 [label="Enter function anonymousFunction"]; - 74 [label="Access variable R|/b|"]; - 75 [label="Postponed enter to lambda"]; + 75 [label="Enter function anonymousFunction"]; + 77 [label="Access variable R|/b|"]; + 78 [label="Postponed enter to lambda"]; subgraph cluster_21 { color=blue - 76 [label="Enter function anonymousFunction"]; - 77 [label="Access variable R|/c|"]; - 78 [label="Postponed enter to lambda"]; + 80 [label="Enter function anonymousFunction"]; + 82 [label="Access variable R|/c|"]; + 83 [label="Postponed enter to lambda"]; subgraph cluster_22 { color=blue - 79 [label="Enter function anonymousFunction"]; - 80 [label="Access variable this@R|special/anonymous|"]; - 81 [label="Type operator: (this@R|special/anonymous| as R|A|)"]; - 82 [label="Access variable this@R|special/anonymous|"]; - 83 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 84 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 85 [label="Exit function anonymousFunction"]; + 85 [label="Enter function anonymousFunction"]; + 87 [label="Access variable this@R|special/anonymous|"]; + 88 [label="Type operator: (this@R|special/anonymous| as R|A|)"]; + 89 [label="Access variable this@R|special/anonymous|"]; + 90 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 91 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 86 [label="Exit function anonymousFunction"]; } - 86 [label="Call arguments union" style="filled" fillcolor=yellow]; - 87 [label="Postponed exit from lambda"]; - 88 [label="Function call: R|kotlin/with|(...)"]; - 89 [label="Access variable this@R|special/anonymous|"]; - 90 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 91 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 92 [label="Exit function anonymousFunction"]; + 93 [label="Call arguments union" style="filled" fillcolor=yellow]; + 84 [label="Postponed exit from lambda"]; + 92 [label="Function call: R|kotlin/with|(...)"]; + 94 [label="Access variable this@R|special/anonymous|"]; + 95 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 96 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 81 [label="Exit function anonymousFunction"]; } - 93 [label="Postponed exit from lambda"]; - 94 [label="Function call: R|kotlin/with|(...)"]; - 95 [label="Exit function anonymousFunction"]; + 79 [label="Postponed exit from lambda"]; + 97 [label="Function call: R|kotlin/with|(...)"]; + 76 [label="Exit function anonymousFunction"]; } - 96 [label="Call arguments union" style="filled" fillcolor=yellow]; - 97 [label="Postponed exit from lambda"]; + 99 [label="Call arguments union" style="filled" fillcolor=yellow]; + 74 [label="Postponed exit from lambda"]; 98 [label="Function call: R|kotlin/with|(...)"]; - 99 [label="Exit function test_3" style="filled" fillcolor=red]; + 71 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 70 -> {71}; - 71 -> {72}; + 70 -> {72}; 72 -> {73}; - 72 -> {97} [color=red]; - 73 -> {74}; - 74 -> {75}; - 75 -> {76}; - 75 -> {93} [color=red]; - 76 -> {77}; + 73 -> {75}; + 73 -> {74} [color=red]; + 74 -> {98} [color=green]; + 75 -> {77}; + 76 -> {74} [color=green]; + 76 -> {99} [color=red]; 77 -> {78}; - 78 -> {79}; - 78 -> {87} [color=red]; - 79 -> {80}; - 80 -> {81}; - 81 -> {82}; + 78 -> {80}; + 78 -> {79} [color=red]; + 79 -> {97}; + 80 -> {82}; + 81 -> {79} [color=green]; + 81 -> {99} [color=red]; 82 -> {83}; - 83 -> {84}; - 84 -> {85}; - 85 -> {87} [color=green]; - 85 -> {86} [color=red]; - 86 -> {88} [color=red]; - 87 -> {88} [color=green]; + 83 -> {85}; + 83 -> {84} [color=red]; + 84 -> {92} [color=green]; + 85 -> {87}; + 86 -> {84} [color=green]; + 86 -> {93} [color=red]; + 87 -> {88}; 88 -> {89}; 89 -> {90}; 90 -> {91}; - 91 -> {92}; - 92 -> {93} [color=green]; - 92 -> {96} [color=red]; - 93 -> {94}; + 91 -> {86}; + 92 -> {94}; + 93 -> {92} [color=red]; 94 -> {95}; - 95 -> {97} [color=green]; - 95 -> {96} [color=red]; - 96 -> {98} [color=red]; - 97 -> {98} [color=green]; - 98 -> {99}; + 95 -> {96}; + 96 -> {81}; + 97 -> {76}; + 98 -> {71}; + 99 -> {98} [color=red]; subgraph cluster_23 { color=red 100 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_24 { color=blue - 101 [label="Enter when"]; + 102 [label="Enter when"]; subgraph cluster_25 { color=blue - 102 [label="Enter when branch condition "]; - 103 [label="Access variable this@R|/test_4|"]; - 104 [label="Type operator: (this@R|/test_4| !is R|A|)"]; - 105 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_26 { color=blue - 106 [label="Enter when branch condition else"]; - 107 [label="Exit when branch condition"]; + 118 [label="Enter when branch condition else"]; + 119 [label="Exit when branch condition"]; } - 108 [label="Enter when branch result"]; + 120 [label="Enter when branch result"]; subgraph cluster_27 { color=blue - 109 [label="Enter block"]; + 121 [label="Enter block"]; subgraph cluster_28 { color=blue - 110 [label="Enter when"]; + 122 [label="Enter when"]; subgraph cluster_29 { color=blue - 111 [label="Enter when branch condition "]; - 112 [label="Access variable this@R|/test_4|"]; - 113 [label="Type operator: (this@R|/test_4| !is R|B|)"]; - 114 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_30 { color=blue - 115 [label="Enter when branch condition else"]; - 116 [label="Exit when branch condition"]; + 138 [label="Enter when branch condition else"]; + 139 [label="Exit when branch condition"]; } - 117 [label="Enter when branch result"]; + 140 [label="Enter when branch result"]; subgraph cluster_31 { color=blue - 118 [label="Enter block"]; - 119 [label="Access variable this@R|/test_4|"]; - 120 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 121 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 122 [label="Access variable this@R|/test_4|"]; - 123 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; - 124 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; - 125 [label="Exit block"]; + 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"]; } - 126 [label="Exit when branch result"]; - 127 [label="Enter when branch result"]; + 149 [label="Exit when branch result"]; + 128 [label="Enter when branch result"]; subgraph cluster_32 { 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|.R|/A.foo|()"]; + 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="Exit block"]; + 135 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 136 [label="Exit block"]; } - 136 [label="Exit when branch result"]; - 137 [label="Exit when"]; + 137 [label="Exit when branch result"]; + 123 [label="Exit when"]; } - 138 [label="Exit block"]; + 150 [label="Exit block"]; } - 139 [label="Exit when branch result"]; - 140 [label="Enter when branch result"]; + 151 [label="Exit when branch result"]; + 108 [label="Enter when branch result"]; subgraph cluster_33 { color=blue - 141 [label="Enter block"]; - 142 [label="Access variable this@R|/test_4|"]; - 143 [label="Function call: this@R|/test_4|.#()"]; - 144 [label="Function call: #()"]; - 145 [label="Access variable this@R|/test_4|"]; - 146 [label="Function call: this@R|/test_4|.#()"]; - 147 [label="Function call: #()"]; - 148 [label="Exit block"]; + 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"]; } - 149 [label="Exit when branch result"]; - 150 [label="Exit when"]; + 117 [label="Exit when branch result"]; + 103 [label="Exit when"]; } - 151 [label="Access variable this@R|/test_4|"]; - 152 [label="Function call: this@R|/test_4|.#()"]; - 153 [label="Function call: #()"]; - 154 [label="Access variable this@R|/test_4|"]; - 155 [label="Function call: this@R|/test_4|.#()"]; - 156 [label="Function call: #()"]; - 157 [label="Exit function test_4" style="filled" fillcolor=red]; + 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]; } - - 100 -> {101}; - 101 -> {102}; - 102 -> {103}; - 103 -> {104}; + 100 -> {102}; + 102 -> {104}; + 103 -> {152}; 104 -> {105}; - 105 -> {140 106}; + 105 -> {106}; 106 -> {107}; - 107 -> {108}; + 107 -> {108 118}; 108 -> {109}; 109 -> {110}; 110 -> {111}; 111 -> {112}; 112 -> {113}; 113 -> {114}; - 114 -> {127 115}; + 114 -> {115}; 115 -> {116}; 116 -> {117}; - 117 -> {118}; + 117 -> {103}; 118 -> {119}; 119 -> {120}; 120 -> {121}; 121 -> {122}; - 122 -> {123}; - 123 -> {124}; + 122 -> {124}; + 123 -> {150}; 124 -> {125}; 125 -> {126}; - 126 -> {137}; - 127 -> {128}; + 126 -> {127}; + 127 -> {128 138}; 128 -> {129}; 129 -> {130}; 130 -> {131}; @@ -417,9 +405,9 @@ digraph implicitReceivers_kt { 134 -> {135}; 135 -> {136}; 136 -> {137}; - 137 -> {138}; + 137 -> {123}; 138 -> {139}; - 139 -> {150}; + 139 -> {140}; 140 -> {141}; 141 -> {142}; 142 -> {143}; @@ -429,48 +417,49 @@ digraph implicitReceivers_kt { 146 -> {147}; 147 -> {148}; 148 -> {149}; - 149 -> {150}; + 149 -> {123}; 150 -> {151}; - 151 -> {152}; + 151 -> {103}; 152 -> {153}; 153 -> {154}; 154 -> {155}; 155 -> {156}; 156 -> {157}; + 157 -> {101}; subgraph cluster_34 { color=red 158 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_35 { color=blue - 159 [label="Enter when"]; + 160 [label="Enter when"]; subgraph cluster_36 { color=blue - 160 [label="Enter when branch condition "]; - 161 [label="Access variable this@R|/test_5|"]; - 162 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"]; - 163 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_37 { color=blue - 164 [label="Enter when branch condition "]; - 165 [label="Access variable this@R|/test_5|"]; - 166 [label="Type operator: (this@R|/test_5| is R|kotlin/String|)"]; - 167 [label="Exit when branch condition"]; + 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 - 168 [label="Enter when branch condition else"]; - 169 [label="Exit when branch condition"]; + 180 [label="Enter when branch condition else"]; + 181 [label="Exit when branch condition"]; } - 170 [label="Enter when branch result"]; + 182 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 171 [label="Enter block"]; - 172 [label="Const: Int(0)"]; - 173 [label="Exit block"]; + 183 [label="Enter block"]; + 184 [label="Const: Int(0)"]; + 185 [label="Exit block"]; } - 174 [label="Exit when branch result"]; + 186 [label="Exit when branch result"]; 175 [label="Enter when branch result"]; subgraph cluster_40 { color=blue @@ -479,17 +468,17 @@ digraph implicitReceivers_kt { 178 [label="Exit block"]; } 179 [label="Exit when branch result"]; - 180 [label="Enter when branch result"]; + 166 [label="Enter when branch result"]; subgraph cluster_41 { color=blue - 181 [label="Enter block"]; - 182 [label="Access variable R|kotlin/collections/List.size|"]; - 183 [label="Exit block"]; + 167 [label="Enter block"]; + 168 [label="Access variable R|kotlin/collections/List.size|"]; + 169 [label="Exit block"]; } - 184 [label="Exit when branch result"]; - 185 [label="Exit when"]; + 170 [label="Exit when branch result"]; + 161 [label="Exit when"]; } - 186 [label="Jump: ^test_5 when () { + 187 [label="Jump: ^test_5 when () { (this@R|/test_5| is R|kotlin/collections/List<*>|) -> { this@R|/test_5|.R|kotlin/collections/List.size| } @@ -501,60 +490,58 @@ digraph implicitReceivers_kt { } } "]; - 187 [label="Stub" style="filled" fillcolor=gray]; - 188 [label="Exit function test_5" style="filled" fillcolor=red]; + 188 [label="Stub" style="filled" fillcolor=gray]; + 159 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 158 -> {159}; - 159 -> {160}; - 160 -> {161}; - 161 -> {162}; + 158 -> {160}; + 160 -> {162}; + 161 -> {187}; 162 -> {163}; - 163 -> {180 164}; + 163 -> {164}; 164 -> {165}; - 165 -> {166}; + 165 -> {166 171}; 166 -> {167}; - 167 -> {175 168}; + 167 -> {168}; 168 -> {169}; 169 -> {170}; - 170 -> {171}; + 170 -> {161}; 171 -> {172}; 172 -> {173}; 173 -> {174}; - 174 -> {185}; + 174 -> {175 180}; 175 -> {176}; 176 -> {177}; 177 -> {178}; 178 -> {179}; - 179 -> {185}; + 179 -> {161}; 180 -> {181}; 181 -> {182}; 182 -> {183}; 183 -> {184}; 184 -> {185}; 185 -> {186}; - 186 -> {188}; - 186 -> {187} [style=dotted]; + 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]; - 190 [label="Access variable this@R|/test_6|"]; - 191 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"]; - 192 [label="Access variable R|kotlin/collections/List.size|"]; - 193 [label="Access variable this@R|/test_6|"]; - 194 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"]; - 195 [label="Access variable R|kotlin/String.length|"]; - 196 [label="Exit 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 -> {190}; - 190 -> {191}; + 189 -> {191}; 191 -> {192}; 192 -> {193}; 193 -> {194}; 194 -> {195}; 195 -> {196}; + 196 -> {190}; } 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 6d3c0fae35e..0ac9cd9e915 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/thisOfExtensionProperty.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/thisOfExtensionProperty.dot @@ -8,7 +8,6 @@ digraph thisOfExtensionProperty_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; subgraph cluster_1 { @@ -16,60 +15,56 @@ digraph thisOfExtensionProperty_kt { 2 [label="Enter function getter" style="filled" fillcolor=red]; 3 [label="Exit function getter" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { - color=red - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Exit property" style="filled" fillcolor=red]; - } - - 4 -> {5}; - - subgraph cluster_3 { color=red 6 [label="Enter class B" 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]; } - + 6 -> {4} [color=green]; + 4 -> {5}; + 5 -> {7} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function getter" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 9 [label="Enter &&"]; - 10 [label="Access variable this@R|/check_1|"]; - 11 [label="Type operator: (this@R|/check_1| is R|B|)"]; - 12 [label="Exit left part of &&"]; - 13 [label="Enter right part of &&"]; - 14 [label="Access variable R|/B.b|"]; - 15 [label="Exit &&"]; + 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 &&"]; } - 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 function getter" style="filled" fillcolor=red]; + 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]; } - - 8 -> {9}; - 9 -> {10}; - 10 -> {11}; + 8 -> {11}; + 10 -> {17}; 11 -> {12}; - 12 -> {15 13}; + 12 -> {13}; 13 -> {14}; - 14 -> {15}; + 14 -> {10 15}; 15 -> {16}; - 16 -> {18}; - 16 -> {17} [style=dotted]; + 16 -> {10}; + 17 -> {9}; 17 -> {18} [style=dotted]; + 18 -> {9} [style=dotted]; subgraph cluster_6 { color=red 19 [label="Enter property" style="filled" fillcolor=red]; 20 [label="Exit property" style="filled" fillcolor=red]; } - 19 -> {20}; subgraph cluster_7 { @@ -77,39 +72,37 @@ digraph thisOfExtensionProperty_kt { 21 [label="Enter function getter" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue - 22 [label="Enter &&"]; - 23 [label="Access variable this@R|/check_2|"]; - 24 [label="Type operator: (this@R|/check_2| is R|B|)"]; - 25 [label="Exit left part of &&"]; - 26 [label="Enter right part of &&"]; - 27 [label="Access variable this@R|/check_2|"]; - 28 [label="Access variable R|/B.b|"]; - 29 [label="Exit &&"]; + 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 &&"]; } - 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 function getter" style="filled" fillcolor=red]; + 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]; } - - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; + 21 -> {24}; + 23 -> {31}; 24 -> {25}; - 25 -> {29 26}; + 25 -> {26}; 26 -> {27}; - 27 -> {28}; + 27 -> {23 28}; 28 -> {29}; 29 -> {30}; - 30 -> {32}; - 30 -> {31} [style=dotted]; + 30 -> {23}; + 31 -> {22}; 31 -> {32} [style=dotted]; + 32 -> {22} [style=dotted]; subgraph cluster_9 { color=red 33 [label="Enter property" style="filled" fillcolor=red]; 34 [label="Exit property" style="filled" fillcolor=red]; } - 33 -> {34}; } 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 ba86e8f7836..4f1ffc23068 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot @@ -6,255 +6,246 @@ digraph assignSafeCall_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter function foo" style="filled" fillcolor=red]; - 4 [label="Const: Int(1)"]; - 5 [label="Jump: ^foo Int(1)"]; - 6 [label="Stub" style="filled" fillcolor=gray]; - 7 [label="Exit function foo" style="filled" fillcolor=red]; + 5 [label="Const: Int(1)"]; + 6 [label="Jump: ^foo Int(1)"]; + 7 [label="Stub" style="filled" fillcolor=gray]; + 4 [label="Exit function foo" style="filled" fillcolor=red]; } - - 3 -> {4}; - 4 -> {5}; - 5 -> {7}; - 5 -> {6} [style=dotted]; + 3 -> {5}; + 5 -> {6}; + 6 -> {4}; 6 -> {7} [style=dotted]; + 7 -> {4} [style=dotted]; subgraph cluster_2 { color=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 - 10 [label="Enter property" style="filled" fillcolor=red]; - 11 [label="Const: Int(1)"]; - 12 [label="Exit property" style="filled" fillcolor=red]; - } - - 10 -> {11}; - 11 -> {12}; - - subgraph cluster_4 { color=red 13 [label="Enter function bar" style="filled" fillcolor=red]; 14 [label="Exit function bar" style="filled" fillcolor=red]; } - 13 -> {14}; - subgraph cluster_5 { + subgraph cluster_4 { color=red 15 [label="Enter class A" 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]; + } 16 [label="Exit class A" style="filled" fillcolor=red]; } - + 15 -> {10} [color=green]; + 10 -> {12}; + 11 -> {16} [color=green]; + 12 -> {11}; subgraph cluster_6 { color=red 17 [label="Enter function test_1" style="filled" fillcolor=red]; - 18 [label="Access variable R|/a|"]; - 19 [label="Enter safe call"]; - 20 [label="Access variable R|/A.x|"]; + 19 [label="Access variable R|/a|"]; + 20 [label="Enter safe call"]; + 22 [label="Access variable R|/A.x|"]; 21 [label="Exit safe call"]; - 22 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 23 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_7 { color=blue - 23 [label="Enter when"]; + 24 [label="Enter when"]; subgraph cluster_8 { color=blue - 24 [label="Enter when branch condition "]; - 25 [label="Access variable R|/x|"]; - 26 [label="Const: Null(null)"]; - 27 [label="Operator !="]; - 28 [label="Exit when branch condition"]; + 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"]; } - 29 [label="Synthetic else branch"]; - 30 [label="Enter when branch result"]; + 37 [label="Synthetic else branch"]; + 31 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 31 [label="Enter block"]; - 32 [label="Access variable R|/a|"]; - 33 [label="Function call: R|/a|.R|/A.bar|()"]; - 34 [label="Exit block"]; + 32 [label="Enter block"]; + 33 [label="Access variable R|/a|"]; + 34 [label="Function call: R|/a|.R|/A.bar|()"]; + 35 [label="Exit block"]; } - 35 [label="Exit when branch result"]; - 36 [label="Exit when"]; + 36 [label="Exit when branch result"]; + 25 [label="Exit when"]; } - 37 [label="Exit function test_1" style="filled" fillcolor=red]; + 18 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 17 -> {18}; - 18 -> {19 21}; - 19 -> {20}; - 20 -> {21}; - 21 -> {22}; - 22 -> {23}; + 17 -> {19}; + 19 -> {20 21}; + 20 -> {22}; + 21 -> {23}; + 22 -> {21}; 23 -> {24}; - 24 -> {25}; - 25 -> {26}; + 24 -> {26}; + 25 -> {18}; 26 -> {27}; 27 -> {28}; - 28 -> {30 29}; - 29 -> {36}; - 30 -> {31}; + 28 -> {29}; + 29 -> {30}; + 30 -> {31 37}; 31 -> {32}; 32 -> {33}; 33 -> {34}; 34 -> {35}; 35 -> {36}; - 36 -> {37}; + 36 -> {25}; + 37 -> {25}; subgraph cluster_10 { color=red 38 [label="Enter function test_2" style="filled" fillcolor=red]; - 39 [label="Access variable R|/a|"]; - 40 [label="Enter safe call"]; - 41 [label="Function call: R|/a|?.R|/A.foo|()"]; + 40 [label="Access variable R|/a|"]; + 41 [label="Enter safe call"]; + 43 [label="Function call: R|/a|?.R|/A.foo|()"]; 42 [label="Exit safe call"]; - 43 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 44 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_11 { color=blue - 44 [label="Enter when"]; + 45 [label="Enter when"]; subgraph cluster_12 { color=blue - 45 [label="Enter when branch condition "]; - 46 [label="Access variable R|/x|"]; - 47 [label="Const: Null(null)"]; - 48 [label="Operator !="]; - 49 [label="Exit when branch condition"]; + 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"]; } - 50 [label="Synthetic else branch"]; - 51 [label="Enter when branch result"]; + 58 [label="Synthetic else branch"]; + 52 [label="Enter when branch result"]; subgraph cluster_13 { color=blue - 52 [label="Enter block"]; - 53 [label="Access variable R|/a|"]; - 54 [label="Function call: R|/a|.R|/A.bar|()"]; - 55 [label="Exit block"]; + 53 [label="Enter block"]; + 54 [label="Access variable R|/a|"]; + 55 [label="Function call: R|/a|.R|/A.bar|()"]; + 56 [label="Exit block"]; } - 56 [label="Exit when branch result"]; - 57 [label="Exit when"]; + 57 [label="Exit when branch result"]; + 46 [label="Exit when"]; } - 58 [label="Exit function test_2" style="filled" fillcolor=red]; + 39 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 38 -> {39}; - 39 -> {40 42}; - 40 -> {41}; - 41 -> {42}; - 42 -> {43}; - 43 -> {44}; + 38 -> {40}; + 40 -> {41 42}; + 41 -> {43}; + 42 -> {44}; + 43 -> {42}; 44 -> {45}; - 45 -> {46}; - 46 -> {47}; + 45 -> {47}; + 46 -> {39}; 47 -> {48}; 48 -> {49}; - 49 -> {51 50}; - 50 -> {57}; - 51 -> {52}; + 49 -> {50}; + 50 -> {51}; + 51 -> {52 58}; 52 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {58}; + 57 -> {46}; + 58 -> {46}; subgraph cluster_14 { color=red 59 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_15 { color=blue - 60 [label="Enter when"]; - 61 [label="Access variable R|/x|"]; - 62 [label="Type operator: (R|/x| as? R|A|)"]; - 63 [label="Variable declaration: lval : R|A?|"]; + 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 - 64 [label="Enter when branch condition "]; - 65 [label="Const: Null(null)"]; - 66 [label="Operator =="]; - 67 [label="Exit when branch condition"]; + 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 - 68 [label="Enter when branch condition else"]; - 69 [label="Exit when branch condition"]; + 76 [label="Enter when branch condition else"]; + 77 [label="Exit when branch condition"]; } - 70 [label="Enter when branch result"]; + 78 [label="Enter when branch result"]; subgraph cluster_18 { color=blue - 71 [label="Enter block"]; - 72 [label="Access variable R|/|"]; - 73 [label="Exit block"]; + 79 [label="Enter block"]; + 80 [label="Access variable R|/|"]; + 81 [label="Exit block"]; } - 74 [label="Exit when branch result"]; - 75 [label="Enter when branch result"]; + 82 [label="Exit when branch result"]; + 70 [label="Enter when branch result"]; subgraph cluster_19 { color=blue - 76 [label="Enter block"]; - 77 [label="Jump: ^test_3 Unit"]; - 78 [label="Stub" style="filled" fillcolor=gray]; - 79 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 80 [label="Exit when branch result" style="filled" fillcolor=gray]; - 81 [label="Exit when"]; + 75 [label="Exit when branch result" style="filled" fillcolor=gray]; + 62 [label="Exit when"]; } - 82 [label="Variable declaration: lval a: R|A|"]; - 83 [label="Access variable R|/a|"]; - 84 [label="Function call: R|/a|.R|/A.foo|()"]; - 85 [label="Access variable R|/x|"]; - 86 [label="Function call: R|/x|.R|/A.foo|()"]; - 87 [label="Exit function test_3" style="filled" fillcolor=red]; + 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 -> {60}; - 60 -> {61}; - 61 -> {62}; - 62 -> {63}; + 59 -> {61}; + 61 -> {63}; + 62 -> {83}; 63 -> {64}; 64 -> {65}; 65 -> {66}; 66 -> {67}; - 67 -> {75 68}; + 67 -> {68}; 68 -> {69}; - 69 -> {70}; + 69 -> {70 76}; 70 -> {71}; 71 -> {72}; - 72 -> {73}; - 73 -> {74}; - 74 -> {81}; - 75 -> {76}; + 72 -> {60}; + 72 -> {73} [style=dotted]; + 73 -> {74} [style=dotted]; + 74 -> {75} [style=dotted]; + 75 -> {62} [style=dotted]; 76 -> {77}; - 77 -> {87}; - 77 -> {78} [style=dotted]; - 78 -> {79} [style=dotted]; - 79 -> {80} [style=dotted]; - 80 -> {81} [style=dotted]; + 77 -> {78}; + 78 -> {79}; + 79 -> {80}; + 80 -> {81}; 81 -> {82}; - 82 -> {83}; + 82 -> {62}; 83 -> {84}; 84 -> {85}; 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]; } - 88 -> {89}; subgraph cluster_21 { @@ -262,218 +253,212 @@ digraph assignSafeCall_kt { 90 [label="Enter function getter" style="filled" fillcolor=red]; 91 [label="Exit function getter" style="filled" fillcolor=red]; } - 90 -> {91}; subgraph cluster_22 { - color=red - 92 [label="Enter property" style="filled" fillcolor=red]; - 93 [label="Exit property" style="filled" fillcolor=red]; - } - - 92 -> {93}; - - subgraph cluster_23 { color=red 94 [label="Enter function bar" style="filled" fillcolor=red]; 95 [label="Exit function bar" style="filled" fillcolor=red]; } - 94 -> {95}; - subgraph cluster_24 { + subgraph cluster_23 { color=red 96 [label="Enter class B" 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]; subgraph cluster_25 { color=red 98 [label="Enter function test_1" style="filled" fillcolor=red]; - 99 [label="Access variable R|/a|"]; - 100 [label="Enter safe call"]; - 101 [label="Access variable R|/B.x|"]; + 100 [label="Access variable R|/a|"]; + 101 [label="Enter safe call"]; + 103 [label="Access variable R|/B.x|"]; 102 [label="Exit safe call"]; - 103 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 104 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_26 { color=blue - 104 [label="Enter when"]; + 105 [label="Enter when"]; subgraph cluster_27 { 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"]; + 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"]; } - 110 [label="Synthetic else branch"]; - 111 [label="Enter when branch result"]; + 118 [label="Synthetic else branch"]; + 112 [label="Enter when branch result"]; subgraph cluster_28 { color=blue - 112 [label="Enter block"]; - 113 [label="Access variable R|/a|"]; - 114 [label="Function call: R|/a|.R|/B.bar|()"]; - 115 [label="Exit block"]; + 113 [label="Enter block"]; + 114 [label="Access variable R|/a|"]; + 115 [label="Function call: R|/a|.R|/B.bar|()"]; + 116 [label="Exit block"]; } - 116 [label="Exit when branch result"]; - 117 [label="Exit when"]; + 117 [label="Exit when branch result"]; + 106 [label="Exit when"]; } - 118 [label="Exit function test_1" style="filled" fillcolor=red]; + 99 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 98 -> {99}; - 99 -> {100 102}; - 100 -> {101}; - 101 -> {102}; - 102 -> {103}; - 103 -> {104}; + 98 -> {100}; + 100 -> {101 102}; + 101 -> {103}; + 102 -> {104}; + 103 -> {102}; 104 -> {105}; - 105 -> {106}; - 106 -> {107}; + 105 -> {107}; + 106 -> {99}; 107 -> {108}; 108 -> {109}; - 109 -> {111 110}; - 110 -> {117}; - 111 -> {112}; + 109 -> {110}; + 110 -> {111}; + 111 -> {112 118}; 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; 116 -> {117}; - 117 -> {118}; + 117 -> {106}; + 118 -> {106}; subgraph cluster_29 { color=red 119 [label="Enter function test_2" style="filled" fillcolor=red]; - 120 [label="Access variable R|/a|"]; - 121 [label="Enter safe call"]; - 122 [label="Function call: R|/a|?.R|/B.foo|()"]; + 121 [label="Access variable R|/a|"]; + 122 [label="Enter safe call"]; + 124 [label="Function call: R|/a|?.R|/B.foo|()"]; 123 [label="Exit safe call"]; - 124 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 125 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_30 { color=blue - 125 [label="Enter when"]; + 126 [label="Enter when"]; subgraph cluster_31 { color=blue - 126 [label="Enter when branch condition "]; - 127 [label="Access variable R|/x|"]; - 128 [label="Const: Null(null)"]; - 129 [label="Operator !="]; - 130 [label="Exit when branch condition"]; + 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"]; } - 131 [label="Synthetic else branch"]; - 132 [label="Enter when branch result"]; + 139 [label="Synthetic else branch"]; + 133 [label="Enter when branch result"]; subgraph cluster_32 { color=blue - 133 [label="Enter block"]; - 134 [label="Access variable R|/a|"]; - 135 [label="Function call: R|/a|.R|/B.bar|()"]; - 136 [label="Exit block"]; + 134 [label="Enter block"]; + 135 [label="Access variable R|/a|"]; + 136 [label="Function call: R|/a|.R|/B.bar|()"]; + 137 [label="Exit block"]; } - 137 [label="Exit when branch result"]; - 138 [label="Exit when"]; + 138 [label="Exit when branch result"]; + 127 [label="Exit when"]; } - 139 [label="Exit function test_2" style="filled" fillcolor=red]; + 120 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 119 -> {120}; - 120 -> {121 123}; - 121 -> {122}; - 122 -> {123}; - 123 -> {124}; - 124 -> {125}; + 119 -> {121}; + 121 -> {122 123}; + 122 -> {124}; + 123 -> {125}; + 124 -> {123}; 125 -> {126}; - 126 -> {127}; - 127 -> {128}; + 126 -> {128}; + 127 -> {120}; 128 -> {129}; 129 -> {130}; - 130 -> {132 131}; - 131 -> {138}; - 132 -> {133}; + 130 -> {131}; + 131 -> {132}; + 132 -> {133 139}; 133 -> {134}; 134 -> {135}; 135 -> {136}; 136 -> {137}; 137 -> {138}; - 138 -> {139}; + 138 -> {127}; + 139 -> {127}; subgraph cluster_33 { color=red 140 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_34 { color=blue - 141 [label="Enter when"]; - 142 [label="Access variable R|/x|"]; - 143 [label="Type operator: (R|/x| as? R|B|)"]; - 144 [label="Variable declaration: lval : R|B?|"]; + 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 - 145 [label="Enter when branch condition "]; - 146 [label="Const: Null(null)"]; - 147 [label="Operator =="]; - 148 [label="Exit when branch condition"]; + 147 [label="Enter when branch condition "]; + 148 [label="Const: Null(null)"]; + 149 [label="Operator =="]; + 150 [label="Exit when branch condition"]; } subgraph cluster_36 { color=blue - 149 [label="Enter when branch condition else"]; - 150 [label="Exit when branch condition"]; + 157 [label="Enter when branch condition else"]; + 158 [label="Exit when branch condition"]; } - 151 [label="Enter when branch result"]; + 159 [label="Enter when branch result"]; subgraph cluster_37 { color=blue - 152 [label="Enter block"]; - 153 [label="Access variable R|/|"]; - 154 [label="Exit block"]; + 160 [label="Enter block"]; + 161 [label="Access variable R|/|"]; + 162 [label="Exit block"]; } - 155 [label="Exit when branch result"]; - 156 [label="Enter when branch result"]; + 163 [label="Exit when branch result"]; + 151 [label="Enter when branch result"]; subgraph cluster_38 { color=blue - 157 [label="Enter block"]; - 158 [label="Jump: ^test_3 Unit"]; - 159 [label="Stub" style="filled" fillcolor=gray]; - 160 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 161 [label="Exit when branch result" style="filled" fillcolor=gray]; - 162 [label="Exit when"]; + 156 [label="Exit when branch result" style="filled" fillcolor=gray]; + 143 [label="Exit when"]; } - 163 [label="Variable declaration: lval a: R|B|"]; - 164 [label="Access variable R|/a|"]; - 165 [label="Function call: R|/a|.R|/B.foo|()"]; - 166 [label="Access variable R|/x|"]; - 167 [label="Function call: R|/x|.R|/B.foo|()"]; - 168 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - - 140 -> {141}; - 141 -> {142}; - 142 -> {143}; - 143 -> {144}; + 140 -> {142}; + 142 -> {144}; + 143 -> {164}; 144 -> {145}; 145 -> {146}; 146 -> {147}; 147 -> {148}; - 148 -> {156 149}; + 148 -> {149}; 149 -> {150}; - 150 -> {151}; + 150 -> {151 157}; 151 -> {152}; 152 -> {153}; - 153 -> {154}; - 154 -> {155}; - 155 -> {162}; - 156 -> {157}; + 153 -> {141}; + 153 -> {154} [style=dotted]; + 154 -> {155} [style=dotted]; + 155 -> {156} [style=dotted]; + 156 -> {143} [style=dotted]; 157 -> {158}; - 158 -> {168}; - 158 -> {159} [style=dotted]; - 159 -> {160} [style=dotted]; - 160 -> {161} [style=dotted]; - 161 -> {162} [style=dotted]; + 158 -> {159}; + 159 -> {160}; + 160 -> {161}; + 161 -> {162}; 162 -> {163}; - 163 -> {164}; + 163 -> {143}; 164 -> {165}; 165 -> {166}; 166 -> {167}; 167 -> {168}; + 168 -> {141}; } 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 dfd48da8e3f..c8288c38bc8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCallAndEqualityToBool.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCallAndEqualityToBool.dot @@ -6,81 +6,78 @@ digraph safeCallAndEqualityToBool_kt { subgraph cluster_0 { color=red 0 [label="Enter function check" style="filled" fillcolor=red]; - 1 [label="Const: Boolean(true)"]; - 2 [label="Jump: ^check Boolean(true)"]; - 3 [label="Stub" style="filled" fillcolor=gray]; - 4 [label="Exit function check" style="filled" fillcolor=red]; + 2 [label="Const: Boolean(true)"]; + 3 [label="Jump: ^check Boolean(true)"]; + 4 [label="Stub" style="filled" fillcolor=gray]; + 1 [label="Exit function check" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {4}; - 2 -> {3} [style=dotted]; + 0 -> {2}; + 2 -> {3}; + 3 -> {1}; 3 -> {4} [style=dotted]; + 4 -> {1} [style=dotted]; subgraph cluster_1 { color=red 5 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_2 { color=blue - 6 [label="Enter when"]; + 7 [label="Enter when"]; subgraph cluster_3 { color=blue - 7 [label="Enter when branch condition "]; - 8 [label="Access variable R|/s|"]; - 9 [label="Enter safe call"]; - 10 [label="Function call: R|/s|?.R|/check|()"]; - 11 [label="Exit safe call"]; - 12 [label="Const: Boolean(true)"]; - 13 [label="Operator =="]; - 14 [label="Exit when branch condition"]; + 9 [label="Enter when branch condition "]; + 10 [label="Access variable R|/s|"]; + 11 [label="Enter safe call"]; + 13 [label="Function call: R|/s|?.R|/check|()"]; + 12 [label="Exit safe call"]; + 14 [label="Const: Boolean(true)"]; + 15 [label="Operator =="]; + 16 [label="Exit when branch condition"]; } subgraph cluster_4 { color=blue - 15 [label="Enter when branch condition else"]; - 16 [label="Exit when branch condition"]; + 23 [label="Enter when branch condition else"]; + 24 [label="Exit when branch condition"]; } - 17 [label="Enter when branch result"]; + 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 #"]; + 20 [label="Access variable R|kotlin/String.length|"]; 21 [label="Exit block"]; } 22 [label="Exit when branch result"]; - 23 [label="Enter when branch result"]; - subgraph cluster_6 { - color=blue - 24 [label="Enter block"]; - 25 [label="Access variable R|/s|"]; - 26 [label="Access variable R|kotlin/String.length|"]; - 27 [label="Exit block"]; - } - 28 [label="Exit when branch result"]; - 29 [label="Exit when"]; + 8 [label="Exit when"]; } - 30 [label="Exit function test_1" style="filled" fillcolor=red]; + 6 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; - 8 -> {9 11}; + 5 -> {7}; + 7 -> {9}; + 8 -> {6}; 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {13}; - 13 -> {14}; - 14 -> {23 15}; + 10 -> {11 12}; + 11 -> {13}; + 12 -> {14}; + 13 -> {12}; + 14 -> {15}; 15 -> {16}; - 16 -> {17}; + 16 -> {17 23}; 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {29}; + 22 -> {8}; 23 -> {24}; 24 -> {25}; 25 -> {26}; @@ -88,70 +85,69 @@ digraph safeCallAndEqualityToBool_kt { 27 -> {28}; 28 -> {29}; 29 -> {30}; + 30 -> {8}; subgraph cluster_7 { color=red 31 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue - 32 [label="Enter when"]; + 33 [label="Enter when"]; subgraph cluster_9 { color=blue - 33 [label="Enter when branch condition "]; - 34 [label="Access variable R|/s|"]; - 35 [label="Enter safe call"]; - 36 [label="Function call: R|/s|?.R|/check|()"]; - 37 [label="Exit safe call"]; - 38 [label="Const: Boolean(false)"]; - 39 [label="Operator =="]; - 40 [label="Exit when branch condition"]; + 35 [label="Enter when branch condition "]; + 36 [label="Access variable R|/s|"]; + 37 [label="Enter safe call"]; + 39 [label="Function call: R|/s|?.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 - 41 [label="Enter when branch condition else"]; - 42 [label="Exit when branch condition"]; + 49 [label="Enter when branch condition else"]; + 50 [label="Exit when branch condition"]; } - 43 [label="Enter when branch result"]; + 51 [label="Enter when branch result"]; subgraph cluster_11 { + color=blue + 52 [label="Enter block"]; + 53 [label="Access variable R|/s|"]; + 54 [label="Access variable #"]; + 55 [label="Exit block"]; + } + 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 #"]; + 46 [label="Access variable R|kotlin/String.length|"]; 47 [label="Exit block"]; } 48 [label="Exit when branch result"]; - 49 [label="Enter when branch result"]; - subgraph cluster_12 { - color=blue - 50 [label="Enter block"]; - 51 [label="Access variable R|/s|"]; - 52 [label="Access variable R|kotlin/String.length|"]; - 53 [label="Exit block"]; - } - 54 [label="Exit when branch result"]; - 55 [label="Exit when"]; + 34 [label="Exit when"]; } - 56 [label="Exit function test_2" style="filled" fillcolor=red]; + 32 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {35 37}; + 31 -> {33}; + 33 -> {35}; + 34 -> {32}; 35 -> {36}; - 36 -> {37}; - 37 -> {38}; - 38 -> {39}; - 39 -> {40}; - 40 -> {49 41}; + 36 -> {37 38}; + 37 -> {39}; + 38 -> {40}; + 39 -> {38}; + 40 -> {41}; 41 -> {42}; - 42 -> {43}; + 42 -> {43 49}; 43 -> {44}; 44 -> {45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {55}; + 48 -> {34}; 49 -> {50}; 50 -> {51}; 51 -> {52}; @@ -159,70 +155,69 @@ digraph safeCallAndEqualityToBool_kt { 53 -> {54}; 54 -> {55}; 55 -> {56}; + 56 -> {34}; subgraph cluster_13 { color=red 57 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_14 { color=blue - 58 [label="Enter when"]; + 59 [label="Enter when"]; subgraph cluster_15 { color=blue - 59 [label="Enter when branch condition "]; - 60 [label="Access variable R|/s|"]; - 61 [label="Enter safe call"]; - 62 [label="Function call: R|/s|?.R|/check|()"]; - 63 [label="Exit safe call"]; - 64 [label="Const: Boolean(true)"]; - 65 [label="Operator !="]; - 66 [label="Exit when branch condition"]; + 61 [label="Enter when branch condition "]; + 62 [label="Access variable R|/s|"]; + 63 [label="Enter safe call"]; + 65 [label="Function call: R|/s|?.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 - 67 [label="Enter when branch condition else"]; - 68 [label="Exit when branch condition"]; + 75 [label="Enter when branch condition else"]; + 76 [label="Exit when branch condition"]; } - 69 [label="Enter when branch result"]; + 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"]; + subgraph cluster_18 { color=blue 70 [label="Enter block"]; 71 [label="Access variable R|/s|"]; - 72 [label="Access variable R|kotlin/String.length|"]; + 72 [label="Access variable #"]; 73 [label="Exit block"]; } 74 [label="Exit when branch result"]; - 75 [label="Enter when branch result"]; - subgraph cluster_18 { - color=blue - 76 [label="Enter block"]; - 77 [label="Access variable R|/s|"]; - 78 [label="Access variable #"]; - 79 [label="Exit block"]; - } - 80 [label="Exit when branch result"]; - 81 [label="Exit when"]; + 60 [label="Exit when"]; } - 82 [label="Exit function test_3" style="filled" fillcolor=red]; + 58 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 57 -> {58}; - 58 -> {59}; - 59 -> {60}; - 60 -> {61 63}; + 57 -> {59}; + 59 -> {61}; + 60 -> {58}; 61 -> {62}; - 62 -> {63}; - 63 -> {64}; - 64 -> {65}; - 65 -> {66}; - 66 -> {75 67}; + 62 -> {63 64}; + 63 -> {65}; + 64 -> {66}; + 65 -> {64}; + 66 -> {67}; 67 -> {68}; - 68 -> {69}; + 68 -> {69 75}; 69 -> {70}; 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; - 74 -> {81}; + 74 -> {60}; 75 -> {76}; 76 -> {77}; 77 -> {78}; @@ -230,70 +225,69 @@ digraph safeCallAndEqualityToBool_kt { 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 - 84 [label="Enter when"]; + 85 [label="Enter when"]; subgraph cluster_21 { color=blue - 85 [label="Enter when branch condition "]; - 86 [label="Access variable R|/s|"]; - 87 [label="Enter safe call"]; - 88 [label="Function call: R|/s|?.R|/check|()"]; - 89 [label="Exit safe call"]; - 90 [label="Const: Boolean(false)"]; - 91 [label="Operator !="]; - 92 [label="Exit when branch condition"]; + 87 [label="Enter when branch condition "]; + 88 [label="Access variable R|/s|"]; + 89 [label="Enter safe call"]; + 91 [label="Function call: R|/s|?.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 - 93 [label="Enter when branch condition else"]; - 94 [label="Exit when branch condition"]; + 101 [label="Enter when branch condition else"]; + 102 [label="Exit when branch condition"]; } - 95 [label="Enter when branch result"]; + 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 R|kotlin/String.length|"]; + 98 [label="Access variable #"]; 99 [label="Exit block"]; } 100 [label="Exit when branch result"]; - 101 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 102 [label="Enter block"]; - 103 [label="Access variable R|/s|"]; - 104 [label="Access variable #"]; - 105 [label="Exit block"]; - } - 106 [label="Exit when branch result"]; - 107 [label="Exit when"]; + 86 [label="Exit when"]; } - 108 [label="Exit function test_4" style="filled" fillcolor=red]; + 84 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 83 -> {84}; - 84 -> {85}; - 85 -> {86}; - 86 -> {87 89}; + 83 -> {85}; + 85 -> {87}; + 86 -> {84}; 87 -> {88}; - 88 -> {89}; - 89 -> {90}; - 90 -> {91}; - 91 -> {92}; - 92 -> {101 93}; + 88 -> {89 90}; + 89 -> {91}; + 90 -> {92}; + 91 -> {90}; + 92 -> {93}; 93 -> {94}; - 94 -> {95}; + 94 -> {95 101}; 95 -> {96}; 96 -> {97}; 97 -> {98}; 98 -> {99}; 99 -> {100}; - 100 -> {107}; + 100 -> {86}; 101 -> {102}; 102 -> {103}; 103 -> {104}; @@ -301,5 +295,6 @@ digraph safeCallAndEqualityToBool_kt { 105 -> {106}; 106 -> {107}; 107 -> {108}; + 108 -> {86}; } 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 0016cfa19a9..f1cb5144593 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot @@ -6,60 +6,56 @@ digraph safeCalls_kt { subgraph cluster_0 { color=red 0 [label="Enter function foo" style="filled" fillcolor=red]; - 1 [label="Const: String()"]; - 2 [label="Jump: ^foo String()"]; - 3 [label="Stub" style="filled" fillcolor=gray]; - 4 [label="Exit function foo" style="filled" fillcolor=red]; + 2 [label="Const: String()"]; + 3 [label="Jump: ^foo String()"]; + 4 [label="Stub" style="filled" fillcolor=gray]; + 1 [label="Exit function foo" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {4}; - 2 -> {3} [style=dotted]; + 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}; subgraph cluster_2 { color=red 7 [label="Enter function test" style="filled" fillcolor=red]; - 8 [label="Access variable R|/x|"]; - 9 [label="Enter safe call"]; - 10 [label="Access variable R|/x|"]; - 11 [label="Access variable R|kotlin/String.length|"]; - 12 [label="Const: Int(1)"]; - 13 [label="Operator =="]; - 14 [label="Function call: R|/x|?.R|/foo|(...)"]; - 15 [label="Exit safe call"]; - 16 [label="Access variable R|/x|"]; - 17 [label="Access variable #"]; - 18 [label="Exit 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: R|/x|?.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 -> {8}; - 8 -> {9 15}; - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; + 7 -> {9}; + 9 -> {10 11}; + 10 -> {12}; + 11 -> {17}; 12 -> {13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; - 16 -> {17}; + 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}; subgraph cluster_4 { @@ -67,7 +63,6 @@ digraph safeCalls_kt { 21 [label="Enter function bool" style="filled" fillcolor=red]; 22 [label="Exit function bool" style="filled" fillcolor=red]; } - 21 -> {22}; subgraph cluster_5 { @@ -75,7 +70,6 @@ digraph safeCalls_kt { 23 [label="Enter function id" style="filled" fillcolor=red]; 24 [label="Exit function id" style="filled" fillcolor=red]; } - 23 -> {24}; subgraph cluster_6 { @@ -83,167 +77,160 @@ digraph safeCalls_kt { 25 [label="Enter class A" style="filled" fillcolor=red]; 26 [label="Exit class A" style="filled" fillcolor=red]; } - 25 -> {26} [color=green]; subgraph cluster_7 { color=red 27 [label="Enter function test_2" style="filled" fillcolor=red]; - 28 [label="Access variable R|/x|"]; - 29 [label="Type operator: (R|/x| as? R|A|)"]; - 30 [label="Enter safe call"]; - 31 [label="Access variable R|/x|"]; - 32 [label="Function call: (R|/x| as? R|A|)?.R|/A.bar|(...)"]; - 33 [label="Exit safe call"]; - 34 [label="Exit 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: (R|/x| as? R|A|)?.R|/A.bar|(...)"]; + 32 [label="Exit safe call"]; + 28 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 27 -> {28}; - 28 -> {29}; - 29 -> {30 33}; - 30 -> {31}; - 31 -> {32}; - 32 -> {33}; + 27 -> {29}; + 29 -> {30}; + 30 -> {31 32}; + 31 -> {33}; + 32 -> {28}; 33 -> {34}; + 34 -> {32}; subgraph cluster_8 { color=red 35 [label="Enter function test_3" style="filled" fillcolor=red]; - 36 [label="Access variable R|/x|"]; - 37 [label="Type operator: (R|/x| as? R|A|)"]; - 38 [label="Enter safe call"]; - 39 [label="Access variable R|/x|"]; - 40 [label="Function call: (R|/x| as? R|A|)?.R|/A.bar|(...)"]; - 41 [label="Exit safe call"]; - 42 [label="Enter safe call"]; - 43 [label="Access variable R|/x|"]; - 44 [label="Function call: R|/x|.R|/A.bool|()"]; - 45 [label="Function call: (R|/x| as? R|A|)?.R|/A.bar|(...)?.R|/foo|(...)"]; - 46 [label="Exit safe call"]; - 47 [label="Enter safe call"]; - 48 [label="Postponed enter to lambda"]; - 49 [label="Postponed exit from lambda"]; - 50 [label="Function call: (R|/x| as? R|A|)?.R|/A.bar|(...)?.R|/foo|(...)?.R|/let|(...)"]; - 51 [label="Exit safe call"]; - 52 [label="Access variable R|/x|"]; - 53 [label="Function call: R|/x|.#()"]; - 54 [label="Exit 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: (R|/x| as? R|A|)?.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: (R|/x| as? R|A|)?.R|/A.bar|(...)?.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: (R|/x| as? R|A|)?.R|/A.bar|(...)?.R|/foo|(...)?.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]; } - - 35 -> {36}; - 36 -> {37}; - 37 -> {38 41}; - 38 -> {39}; - 39 -> {40}; - 40 -> {41}; - 41 -> {42 46}; - 42 -> {43}; - 43 -> {44}; - 44 -> {45}; + 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 51}; - 47 -> {48}; - 48 -> {49 49} [color=green]; - 49 -> {50}; - 50 -> {51}; + 46 -> {47}; + 47 -> {44}; + 48 -> {50}; + 49 -> {53}; + 50 -> {51 51} [color=green]; + 50 -> {55} [color=red]; 51 -> {52}; - 52 -> {53}; + 52 -> {49}; 53 -> {54}; - - subgraph cluster_9 { - color=red - 55 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 56 [label="Access variable R|/x|"]; - 57 [label="Function call: R|/x|.R|/A.bool|()"]; - 58 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 55 -> {56}; - 56 -> {57}; + 54 -> {36}; + 55 -> {57}; 57 -> {58}; + 58 -> {56}; subgraph cluster_10 { color=red 59 [label="Enter function test_4" style="filled" fillcolor=red]; - 60 [label="Access variable R|/x|"]; - 61 [label="Enter safe call"]; - 62 [label="Function call: R|/x|?.R|/A.id|()"]; + 61 [label="Access variable R|/x|"]; + 62 [label="Enter safe call"]; + 64 [label="Function call: R|/x|?.R|/A.id|()"]; 63 [label="Exit safe call"]; - 64 [label="Enter safe call"]; - 65 [label="Function call: R|/x|?.R|/A.id|()?.R|/A.bool|()"]; + 65 [label="Enter safe call"]; + 67 [label="Function call: R|/x|?.R|/A.id|()?.R|/A.bool|()"]; 66 [label="Exit safe call"]; - 67 [label="Access variable R|/x|"]; - 68 [label="Function call: R|/x|.#()"]; - 69 [label="Exit function test_4" style="filled" fillcolor=red]; + 68 [label="Access variable R|/x|"]; + 69 [label="Function call: R|/x|.#()"]; + 60 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 59 -> {60}; - 60 -> {61 63}; - 61 -> {62}; - 62 -> {63}; - 63 -> {64 66}; - 64 -> {65}; - 65 -> {66}; - 66 -> {67}; - 67 -> {68}; + 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}; subgraph cluster_12 { color=red 72 [label="Enter function test_5" style="filled" fillcolor=red]; - 73 [label="Access variable R|/x|"]; - 74 [label="Enter safe call"]; - 75 [label="Postponed enter to lambda"]; + 74 [label="Access variable R|/x|"]; + 75 [label="Enter safe call"]; + 77 [label="Postponed enter to lambda"]; subgraph cluster_13 { color=blue - 76 [label="Enter function anonymousFunction"]; - 77 [label="Jump: ^test_5 Unit"]; - 78 [label="Stub" style="filled" fillcolor=gray]; - 79 [label="Exit function anonymousFunction" style="filled" fillcolor=gray]; + 79 [label="Enter function anonymousFunction"]; + 81 [label="Jump: ^test_5 Unit"]; + 82 [label="Stub" style="filled" fillcolor=gray]; + 80 [label="Exit function anonymousFunction" style="filled" fillcolor=gray]; } - 80 [label="Call arguments union" style="filled" fillcolor=gray]; - 81 [label="Postponed exit from lambda"]; - 82 [label="Function call: R|/x|?.R|kotlin/let|(...)" style="filled" fillcolor=gray]; - 83 [label="Exit safe call"]; - 84 [label="Enter safe call"]; - 85 [label="Access variable R|/x|"]; - 86 [label="Function call: R|/x|.R|/A.bool|()"]; - 87 [label="Function call: R|/x|?.R|kotlin/let|(...)?.R|/boo|(...)"]; - 88 [label="Exit safe call"]; - 89 [label="Access variable R|/x|"]; - 90 [label="Function call: R|/x|.#()"]; - 91 [label="Exit function test_5" style="filled" fillcolor=red]; + 84 [label="Call arguments union" style="filled" fillcolor=gray]; + 78 [label="Postponed exit from lambda"]; + 83 [label="Function call: R|/x|?.R|kotlin/let|(...)" style="filled" fillcolor=gray]; + 76 [label="Exit safe call"]; + 85 [label="Enter safe call"]; + 87 [label="Access variable R|/x|"]; + 88 [label="Function call: R|/x|.R|/A.bool|()"]; + 89 [label="Function call: R|/x|?.R|kotlin/let|(...)?.R|/boo|(...)"]; + 86 [label="Exit safe call"]; + 90 [label="Access variable R|/x|"]; + 91 [label="Function call: R|/x|.#()"]; + 73 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 72 -> {73}; - 73 -> {74 83}; - 74 -> {75}; - 75 -> {76}; - 75 -> {81} [color=red]; - 76 -> {77}; - 77 -> {91}; - 77 -> {78} [style=dotted]; - 78 -> {79} [style=dotted]; - 79 -> {80} [style=dotted]; - 79 -> {81} [color=green]; - 80 -> {82} [style=dotted]; - 81 -> {82} [color=green]; - 82 -> {83} [style=dotted]; - 83 -> {84 88}; - 84 -> {85}; - 85 -> {86}; - 86 -> {87}; + 72 -> {74}; + 74 -> {75 76}; + 75 -> {77}; + 76 -> {85 86}; + 77 -> {79}; + 77 -> {78} [color=red]; + 78 -> {83} [color=green]; + 79 -> {81}; + 80 -> {84} [style=dotted]; + 80 -> {78} [color=green]; + 81 -> {73}; + 81 -> {82} [style=dotted]; + 82 -> {80} [style=dotted]; + 83 -> {76} [style=dotted]; + 84 -> {83} [style=dotted]; + 85 -> {87}; + 86 -> {90}; 87 -> {88}; 88 -> {89}; - 89 -> {90}; + 89 -> {86}; 90 -> {91}; + 91 -> {73}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot index af97c58c879..a2ba64be3fd 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot @@ -8,7 +8,6 @@ digraph smartCastInInit_kt { 0 [label="Enter class I" style="filled" fillcolor=red]; 1 [label="Exit class I" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; subgraph cluster_1 { @@ -16,7 +15,6 @@ digraph smartCastInInit_kt { 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 2 -> {3}; subgraph cluster_2 { @@ -24,80 +22,74 @@ digraph smartCastInInit_kt { 4 [label="Enter class S" style="filled" fillcolor=red]; 5 [label="Exit class S" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; subgraph cluster_3 { color=red 6 [label="Enter function s" style="filled" fillcolor=red]; - 7 [label="Function call: R|kotlin/TODO|()"]; - 8 [label="Stub" style="filled" fillcolor=gray]; - 9 [label="Jump: ^s R|kotlin/TODO|()" style="filled" fillcolor=gray]; - 10 [label="Stub" style="filled" fillcolor=gray]; - 11 [label="Exit 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]; + 7 [label="Exit function s" style="filled" fillcolor=red]; } - - 6 -> {7}; - 7 -> {11}; - 7 -> {8} [style=dotted]; + 6 -> {8}; + 8 -> {7}; 8 -> {9} [style=dotted]; - 9 -> {11 10} [style=dotted]; - 10 -> {11} [style=dotted]; + 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]; - 13 [label="Delegated constructor call: super()"]; - 14 [label="Exit function " style="filled" fillcolor=red]; + 14 [label="Delegated constructor call: super()"]; + 13 [label="Exit function " style="filled" fillcolor=red]; } - - 12 -> {13}; - 13 -> {14}; + 12 -> {14}; + 14 -> {13}; subgraph cluster_5 { color=red 15 [label="Enter function getter" style="filled" fillcolor=red]; 16 [label="Exit function getter" style="filled" fillcolor=red]; } - 15 -> {16}; subgraph cluster_6 { color=red - 17 [label="Enter property" style="filled" fillcolor=red]; - 18 [label="Exit property" style="filled" fillcolor=red]; - } - - 17 -> {18}; - - subgraph cluster_7 { - color=red - 19 [label="Enter init block" style="filled" fillcolor=red]; + 27 [label="Enter class Main" 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]; + } subgraph cluster_8 { color=blue - 20 [label="Enter block"]; - 21 [label="Function call: R|/s|()"]; - 22 [label="Assignmenet: R|/Main.x|"]; - 23 [label="Access variable R|/Main.x|"]; - 24 [label="Function call: this@R|/Main|.R|/Main.x|.R|/S.foo|()"]; - 25 [label="Exit block"]; + 19 [label="Enter init block" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 21 [label="Enter block"]; + 22 [label="Function call: R|/s|()"]; + 23 [label="Assignment: R|/Main.x|"]; + 24 [label="Access variable R|/Main.x|"]; + 25 [label="Function call: this@R|/Main|.R|/Main.x|.R|/S.foo|()"]; + 26 [label="Exit block"]; + } + 20 [label="Exit init block" style="filled" fillcolor=red]; } - 26 [label="Exit init block" style="filled" fillcolor=red]; + 28 [label="Exit class Main" style="filled" fillcolor=red]; } - - 19 -> {20}; - 20 -> {21}; + 27 -> {17} [color=green]; + 17 -> {18}; + 18 -> {19} [color=green]; + 19 -> {21}; + 20 -> {28} [color=green]; 21 -> {22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; - - subgraph cluster_9 { - color=red - 27 [label="Enter class Main" style="filled" fillcolor=red]; - 28 [label="Exit class Main" style="filled" fillcolor=red]; - } - + 26 -> {20}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot index 40fc224ef35..880f862df8e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot @@ -6,280 +6,267 @@ digraph smartcastToNothing_kt { subgraph cluster_0 { color=red 0 [label="Enter function getNothing" style="filled" fillcolor=red]; - 1 [label="Function call: R|java/lang/Exception.Exception|()"]; - 2 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 3 [label="Stub" style="filled" fillcolor=gray]; - 4 [label="Jump: ^getNothing throw R|java/lang/Exception.Exception|()" style="filled" fillcolor=gray]; - 5 [label="Stub" style="filled" fillcolor=gray]; - 6 [label="Exit 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]; + 1 [label="Exit function getNothing" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {6}; - 2 -> {3} [style=dotted]; + 0 -> {2}; + 2 -> {3}; + 3 -> {1}; 3 -> {4} [style=dotted]; - 4 -> {6 5} [style=dotted]; - 5 -> {6} [style=dotted]; + 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]; - 8 [label="Const: Null(null)"]; - 9 [label="Jump: ^getNullableNothing Null(null)"]; - 10 [label="Stub" style="filled" fillcolor=gray]; - 11 [label="Exit 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 -> {8}; - 8 -> {9}; - 9 -> {11}; - 9 -> {10} [style=dotted]; + 7 -> {9}; + 9 -> {10}; + 10 -> {8}; 10 -> {11} [style=dotted]; + 11 -> {8} [style=dotted]; subgraph cluster_2 { color=red 12 [label="Enter function getter" style="filled" fillcolor=red]; - 13 [label="Const: Int(1)"]; - 14 [label="Jump: ^ Int(1)"]; - 15 [label="Stub" style="filled" fillcolor=gray]; - 16 [label="Exit 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]; } - - 12 -> {13}; - 13 -> {14}; - 14 -> {16}; - 14 -> {15} [style=dotted]; + 12 -> {14}; + 14 -> {15}; + 15 -> {13}; 15 -> {16} [style=dotted]; + 16 -> {13} [style=dotted]; subgraph cluster_3 { color=red 17 [label="Enter property" style="filled" fillcolor=red]; 18 [label="Exit property" style="filled" fillcolor=red]; } - 17 -> {18}; subgraph cluster_4 { color=red 19 [label="Enter function getter" style="filled" fillcolor=red]; - 20 [label="Const: Int(2)"]; - 21 [label="Jump: ^ Int(2)"]; - 22 [label="Stub" style="filled" fillcolor=gray]; - 23 [label="Exit 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]; } - - 19 -> {20}; - 20 -> {21}; - 21 -> {23}; - 21 -> {22} [style=dotted]; + 19 -> {21}; + 21 -> {22}; + 22 -> {20}; 22 -> {23} [style=dotted]; + 23 -> {20} [style=dotted]; subgraph cluster_5 { color=red 24 [label="Enter property" style="filled" fillcolor=red]; 25 [label="Exit property" style="filled" fillcolor=red]; } - 24 -> {25}; subgraph cluster_6 { color=red 26 [label="Enter function myListOf" style="filled" fillcolor=red]; - 27 [label="Const: Null(null)"]; - 28 [label="Check not null: Null(null)!!"]; - 29 [label="Jump: ^myListOf Null(null)!!"]; - 30 [label="Stub" style="filled" fillcolor=gray]; - 31 [label="Exit 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]; } - - 26 -> {27}; - 27 -> {28}; + 26 -> {28}; 28 -> {29}; - 29 -> {31}; - 29 -> {30} [style=dotted]; + 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]; - 33 [label="Delegated constructor call: super()"]; - 34 [label="Exit function " style="filled" fillcolor=red]; + 34 [label="Delegated constructor call: super()"]; + 33 [label="Exit function " style="filled" fillcolor=red]; } - - 32 -> {33}; - 33 -> {34}; + 32 -> {34}; + 34 -> {33}; subgraph cluster_8 { color=red 35 [label="Enter function getter" style="filled" fillcolor=red]; 36 [label="Exit function getter" style="filled" fillcolor=red]; } - 35 -> {36}; subgraph cluster_9 { - color=red - 37 [label="Enter property" style="filled" fillcolor=red]; - 38 [label="Const: Int(1)"]; - 39 [label="Exit property" style="filled" fillcolor=red]; - } - - 37 -> {38}; - 38 -> {39}; - - subgraph cluster_10 { color=red 40 [label="Enter function getter" style="filled" fillcolor=red]; 41 [label="Exit function getter" style="filled" fillcolor=red]; } - 40 -> {41}; - subgraph cluster_11 { - color=red - 42 [label="Enter property" style="filled" fillcolor=red]; - 43 [label="Const: Boolean(true)"]; - 44 [label="Exit property" style="filled" fillcolor=red]; - } - - 42 -> {43}; - 43 -> {44}; - - subgraph cluster_12 { + subgraph cluster_10 { color=red 45 [label="Enter class A" 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]; } - + 45 -> {37} [color=green]; + 37 -> {39}; + 38 -> {42} [color=green]; + 39 -> {38}; + 42 -> {44}; + 43 -> {46} [color=green]; + 44 -> {43}; subgraph cluster_13 { color=red 47 [label="Enter function test_0" style="filled" fillcolor=red]; - 48 [label="Const: Null(null)"]; - 49 [label="Variable declaration: lvar s: R|A?|"]; - 50 [label="Access variable R|/results|"]; - 51 [label="Function call: R|/results|.R|FakeOverride|>|()"]; - 52 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + 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|"]; subgraph cluster_14 { color=blue - 53 [label="Enter while loop"]; + 54 [label="Enter while loop"]; subgraph cluster_15 { color=blue - 54 [label="Enter loop condition"]; - 55 [label="Access variable R|/|"]; - 56 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 57 [label="Exit loop condition"]; + 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 - 58 [label="Enter loop block"]; + 60 [label="Enter loop block"]; subgraph cluster_17 { color=blue - 59 [label="Enter block"]; - 60 [label="Access variable R|/|"]; - 61 [label="Function call: R|/|.R|FakeOverride|()"]; - 62 [label="Stub" style="filled" fillcolor=gray]; - 63 [label="Variable declaration: lval result: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 64 [label="Access variable R|/result|" style="filled" fillcolor=gray]; - 65 [label="Stub" style="filled" fillcolor=gray]; - 66 [label="Assignmenet: R|/s|" style="filled" fillcolor=gray]; + 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 - 67 [label="Enter when" style="filled" fillcolor=gray]; + 69 [label="Enter when" style="filled" fillcolor=gray]; subgraph cluster_19 { color=blue - 68 [label="Enter when branch condition " style="filled" fillcolor=gray]; - 69 [label="Access variable R|/result|" style="filled" fillcolor=gray]; - 70 [label="Stub" style="filled" fillcolor=gray]; - 71 [label="Access variable #" style="filled" fillcolor=gray]; - 72 [label="Exit when branch condition" style="filled" fillcolor=gray]; + 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]; } - 73 [label="Synthetic else branch" style="filled" fillcolor=gray]; - 74 [label="Enter when branch result" 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 - 75 [label="Enter block" style="filled" fillcolor=gray]; - 76 [label="Jump: break@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] " style="filled" fillcolor=gray]; - 77 [label="Stub" style="filled" fillcolor=gray]; - 78 [label="Exit block" style="filled" fillcolor=gray]; + 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]; } - 79 [label="Exit when branch result" style="filled" fillcolor=gray]; - 80 [label="Exit when" style="filled" fillcolor=gray]; + 81 [label="Exit when branch result" style="filled" fillcolor=gray]; + 70 [label="Exit when" style="filled" fillcolor=gray]; } - 81 [label="Exit block" style="filled" fillcolor=gray]; + 83 [label="Exit block" style="filled" fillcolor=gray]; } - 82 [label="Exit loop block" style="filled" fillcolor=gray]; + 84 [label="Exit loop block" style="filled" fillcolor=gray]; } - 83 [label="Exit whileloop"]; + 55 [label="Exit whileloop"]; } - 84 [label="Access variable R|/s|"]; - 85 [label="Enter safe call"]; - 86 [label="Postponed enter to lambda"]; + 85 [label="Access variable R|/s|"]; + 86 [label="Enter safe call"]; + 88 [label="Postponed enter to lambda"]; subgraph cluster_21 { color=blue - 87 [label="Enter function anonymousFunction"]; - 88 [label="Access variable R|/it|"]; - 89 [label="Access variable R|/A.a|"]; - 90 [label="Exit function anonymousFunction"]; + 90 [label="Enter function anonymousFunction"]; + 92 [label="Access variable R|/it|"]; + 93 [label="Access variable R|/A.a|"]; + 91 [label="Exit function anonymousFunction"]; } - 91 [label="Call arguments union" style="filled" fillcolor=yellow]; - 92 [label="Postponed exit from lambda"]; - 93 [label="Function call: R|/s|?.R|kotlin/let|(...)"]; - 94 [label="Exit safe call"]; - 95 [label="Exit function test_0" style="filled" fillcolor=red]; + 95 [label="Call arguments union" style="filled" fillcolor=yellow]; + 89 [label="Postponed exit from lambda"]; + 94 [label="Function call: R|/s|?.R|kotlin/let|(...)"]; + 87 [label="Exit safe call"]; + 48 [label="Exit function test_0" style="filled" fillcolor=red]; } - - 47 -> {48}; - 48 -> {49}; + 47 -> {49}; 49 -> {50}; 50 -> {51}; 51 -> {52}; 52 -> {53}; 53 -> {54}; - 54 -> {55}; - 55 -> {56}; + 54 -> {56}; + 55 -> {85}; 56 -> {57}; - 57 -> {83 58}; + 57 -> {58}; 58 -> {59}; - 59 -> {60}; + 59 -> {55 60}; 60 -> {61}; - 61 -> {95}; - 61 -> {62} [style=dotted]; - 62 -> {63} [style=dotted]; + 61 -> {62}; + 62 -> {63}; + 63 -> {48}; 63 -> {64} [style=dotted]; - 64 -> {95 65} [style=dotted]; + 64 -> {65} [style=dotted]; 65 -> {66} [style=dotted]; - 66 -> {67} [style=dotted]; + 66 -> {48 67} [style=dotted]; 67 -> {68} [style=dotted]; 68 -> {69} [style=dotted]; - 69 -> {95 70} [style=dotted]; - 70 -> {71} [style=dotted]; + 69 -> {71} [style=dotted]; + 70 -> {83} [style=dotted]; 71 -> {72} [style=dotted]; - 72 -> {74 73} [style=dotted]; - 73 -> {80} [style=dotted]; + 72 -> {48 73} [style=dotted]; + 73 -> {74} [style=dotted]; 74 -> {75} [style=dotted]; - 75 -> {76} [style=dotted]; - 76 -> {83 77} [style=dotted]; + 75 -> {76 82} [style=dotted]; + 76 -> {77} [style=dotted]; 77 -> {78} [style=dotted]; - 78 -> {79} [style=dotted]; + 78 -> {55 79} [style=dotted]; 79 -> {80} [style=dotted]; 80 -> {81} [style=dotted]; - 81 -> {82} [style=dotted]; - 82 -> {54} [style=dotted]; - 83 -> {84}; - 84 -> {85 94}; - 85 -> {86}; - 86 -> {87}; - 86 -> {92} [color=red]; - 87 -> {88}; - 88 -> {89}; - 89 -> {90}; - 90 -> {92} [color=green]; - 90 -> {91} [color=red]; - 91 -> {93} [color=red]; - 92 -> {93} [color=green]; - 93 -> {94}; - 94 -> {95} [style=dotted]; + 81 -> {70} [style=dotted]; + 82 -> {70} [style=dotted]; + 83 -> {84} [style=dotted]; + 84 -> {56} [style=dotted]; + 85 -> {86 87}; + 86 -> {88}; + 87 -> {48} [style=dotted]; + 88 -> {90}; + 88 -> {89} [color=red]; + 89 -> {94} [color=green]; + 90 -> {92}; + 91 -> {89} [color=green]; + 91 -> {95} [color=red]; + 92 -> {93}; + 93 -> {91}; + 94 -> {87}; + 95 -> {94} [color=red]; } 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 e489591d644..6300d12cdc8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot @@ -6,99 +6,93 @@ digraph overridenOpenVal_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=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 - 5 [label="Enter property" style="filled" fillcolor=red]; - 6 [label="Access variable R|/x|"]; - 7 [label="Exit property" style="filled" fillcolor=red]; - } - - 5 -> {6}; - 6 -> {7}; - - subgraph cluster_3 { color=red 8 [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 -> {5} [color=green]; + 5 -> {7}; + 6 -> {9} [color=green]; + 7 -> {6}; subgraph cluster_4 { color=red 10 [label="Enter function " style="filled" fillcolor=red]; - 11 [label="Access variable R|/x|"]; - 12 [label="Delegated constructor call: super(...)"]; - 13 [label="Exit function " style="filled" fillcolor=red]; + 12 [label="Access variable R|/x|"]; + 13 [label="Delegated constructor call: super(...)"]; + 11 [label="Exit function " style="filled" fillcolor=red]; } - - 10 -> {11}; - 11 -> {12}; + 10 -> {12}; 12 -> {13}; + 13 -> {11}; subgraph cluster_5 { color=red 14 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 15 [label="Enter when"]; + 16 [label="Enter when"]; subgraph cluster_7 { color=blue - 16 [label="Enter when branch condition "]; - 17 [label="Access variable R|/A.x|"]; - 18 [label="Type operator: (this@R|/B|.R|/A.x| is R|kotlin/String|)"]; - 19 [label="Exit when branch condition"]; + 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"]; } - 20 [label="Synthetic else branch"]; - 21 [label="Enter when branch result"]; + 28 [label="Synthetic else branch"]; + 22 [label="Enter when branch result"]; subgraph cluster_8 { color=blue - 22 [label="Enter block"]; - 23 [label="Access variable R|/A.x|"]; - 24 [label="Access variable R|kotlin/String.length|"]; - 25 [label="Exit block"]; + 23 [label="Enter block"]; + 24 [label="Access variable R|/A.x|"]; + 25 [label="Access variable R|kotlin/String.length|"]; + 26 [label="Exit block"]; } - 26 [label="Exit when branch result"]; - 27 [label="Exit when"]; + 27 [label="Exit when branch result"]; + 17 [label="Exit when"]; } - 28 [label="Exit function test_1" style="filled" fillcolor=red]; + 15 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 14 -> {15}; - 15 -> {16}; - 16 -> {17}; - 17 -> {18}; + 14 -> {16}; + 16 -> {18}; + 17 -> {15}; 18 -> {19}; - 19 -> {21 20}; - 20 -> {27}; - 21 -> {22}; + 19 -> {20}; + 20 -> {21}; + 21 -> {22 28}; 22 -> {23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {28}; + 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]; subgraph cluster_10 { @@ -106,46 +100,45 @@ digraph overridenOpenVal_kt { 31 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_11 { color=blue - 32 [label="Enter when"]; + 33 [label="Enter when"]; subgraph cluster_12 { color=blue - 33 [label="Enter when branch condition "]; - 34 [label="Access variable R|/b|"]; - 35 [label="Access variable R|/A.x|"]; - 36 [label="Type operator: (R|/b|.R|/A.x| is R|kotlin/String|)"]; - 37 [label="Exit when branch condition"]; + 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"]; } - 38 [label="Synthetic else branch"]; - 39 [label="Enter when branch result"]; + 47 [label="Synthetic else branch"]; + 40 [label="Enter when branch result"]; subgraph cluster_13 { color=blue - 40 [label="Enter block"]; - 41 [label="Access variable R|/b|"]; - 42 [label="Access variable R|/A.x|"]; - 43 [label="Access variable R|kotlin/String.length|"]; - 44 [label="Exit block"]; + 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"]; } - 45 [label="Exit when branch result"]; - 46 [label="Exit when"]; + 46 [label="Exit when branch result"]; + 34 [label="Exit when"]; } - 47 [label="Exit function test_2" style="filled" fillcolor=red]; + 32 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {35}; + 31 -> {33}; + 33 -> {35}; + 34 -> {32}; 35 -> {36}; 36 -> {37}; - 37 -> {39 38}; - 38 -> {46}; - 39 -> {40}; + 37 -> {38}; + 38 -> {39}; + 39 -> {40 47}; 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; 44 -> {45}; 45 -> {46}; - 46 -> {47}; + 46 -> {34}; + 47 -> {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 d4a2e26d0d5..7e729d50019 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot @@ -6,19 +6,17 @@ digraph delayedAssignment_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter function foo" style="filled" fillcolor=red]; 4 [label="Exit function foo" style="filled" fillcolor=red]; } - 3 -> {4}; subgraph cluster_2 { @@ -26,70 +24,67 @@ digraph delayedAssignment_kt { 5 [label="Enter class A" style="filled" fillcolor=red]; 6 [label="Exit class A" style="filled" fillcolor=red]; } - 5 -> {6} [color=green]; subgraph cluster_3 { color=red 7 [label="Enter function test" style="filled" fillcolor=red]; - 8 [label="Variable declaration: lval a: R|A?|"]; + 9 [label="Variable declaration: lval a: R|A?|"]; subgraph cluster_4 { color=blue - 9 [label="Enter when"]; + 10 [label="Enter when"]; subgraph cluster_5 { color=blue - 10 [label="Enter when branch condition "]; - 11 [label="Access variable R|/b|"]; - 12 [label="Exit when branch condition"]; + 12 [label="Enter when branch condition "]; + 13 [label="Access variable R|/b|"]; + 14 [label="Exit when branch condition"]; } subgraph cluster_6 { color=blue - 13 [label="Enter when branch condition else"]; - 14 [label="Exit when branch condition"]; + 23 [label="Enter when branch condition else"]; + 24 [label="Exit when branch condition"]; } - 15 [label="Enter when branch result"]; + 25 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 16 [label="Enter block"]; - 17 [label="Const: Null(null)"]; - 18 [label="Assignmenet: R|/a|"]; - 19 [label="Exit block"]; + 26 [label="Enter block"]; + 27 [label="Const: Null(null)"]; + 28 [label="Assignment: R|/a|"]; + 29 [label="Exit block"]; } - 20 [label="Exit when branch result"]; - 21 [label="Enter when branch result"]; + 30 [label="Exit when branch result"]; + 15 [label="Enter when branch result"]; subgraph cluster_8 { color=blue - 22 [label="Enter block"]; - 23 [label="Function call: R|/A.A|()"]; - 24 [label="Assignmenet: R|/a|"]; - 25 [label="Access variable R|/a|"]; - 26 [label="Function call: R|/a|.R|/A.foo|()"]; - 27 [label="Exit block"]; + 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"]; } - 28 [label="Exit when branch result"]; - 29 [label="Exit when"]; + 22 [label="Exit when branch result"]; + 11 [label="Exit when"]; } - 30 [label="Access variable R|/a|"]; - 31 [label="Function call: R|/a|.#()"]; - 32 [label="Exit function test" style="filled" fillcolor=red]; + 31 [label="Access variable R|/a|"]; + 32 [label="Function call: R|/a|.#()"]; + 8 [label="Exit function test" style="filled" fillcolor=red]; } - - 7 -> {8}; - 8 -> {9}; + 7 -> {9}; 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {21 13}; + 10 -> {12}; + 11 -> {31}; + 12 -> {13}; 13 -> {14}; - 14 -> {15}; + 14 -> {15 23}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; 19 -> {20}; - 20 -> {29}; + 20 -> {21}; 21 -> {22}; - 22 -> {23}; + 22 -> {11}; 23 -> {24}; 24 -> {25}; 25 -> {26}; @@ -97,7 +92,8 @@ digraph delayedAssignment_kt { 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {31}; + 30 -> {11}; 31 -> {32}; + 32 -> {8}; } 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 3606b595173..260a281febe 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/smartcastAfterReassignment.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/smartcastAfterReassignment.dot @@ -6,94 +6,90 @@ digraph smartcastAfterReassignment_kt { subgraph cluster_0 { color=red 0 [label="Enter function test_1" style="filled" fillcolor=red]; - 1 [label="Const: Int(1)"]; - 2 [label="Variable declaration: lvar x: R|kotlin/Any|"]; - 3 [label="Const: String()"]; - 4 [label="Assignmenet: R|/x|"]; - 5 [label="Access variable R|/x|"]; - 6 [label="Access variable R|kotlin/String.length|"]; - 7 [label="Exit 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|"]; + 1 [label="Exit function test_1" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; 2 -> {3}; 3 -> {4}; 4 -> {5}; 5 -> {6}; 6 -> {7}; + 7 -> {1}; subgraph cluster_1 { color=red 8 [label="Enter function test_2" style="filled" fillcolor=red]; - 9 [label="Const: Null(null)"]; - 10 [label="Variable declaration: lvar x: R|kotlin/String?|"]; + 10 [label="Const: Null(null)"]; + 11 [label="Variable declaration: lvar x: R|kotlin/String?|"]; subgraph cluster_2 { color=blue - 11 [label="Enter when"]; + 12 [label="Enter when"]; subgraph cluster_3 { color=blue - 12 [label="Enter when branch condition "]; - 13 [label="Access variable R|/x|"]; - 14 [label="Const: Null(null)"]; - 15 [label="Operator =="]; - 16 [label="Exit when branch condition"]; + 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"]; } - 17 [label="Synthetic else branch"]; - 18 [label="Enter when branch result"]; + 25 [label="Synthetic else branch"]; + 19 [label="Enter when branch result"]; subgraph cluster_4 { color=blue - 19 [label="Enter block"]; - 20 [label="Const: String()"]; - 21 [label="Assignmenet: R|/x|"]; - 22 [label="Exit block"]; + 20 [label="Enter block"]; + 21 [label="Const: String()"]; + 22 [label="Assignment: R|/x|"]; + 23 [label="Exit block"]; } - 23 [label="Exit when branch result"]; - 24 [label="Exit when"]; + 24 [label="Exit when branch result"]; + 13 [label="Exit when"]; } - 25 [label="Access variable R|/x|"]; - 26 [label="Access variable R|kotlin/String.length|"]; - 27 [label="Exit function test_2" style="filled" fillcolor=red]; + 26 [label="Access variable R|/x|"]; + 27 [label="Access variable R|kotlin/String.length|"]; + 9 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 8 -> {9}; - 9 -> {10}; + 8 -> {10}; 10 -> {11}; 11 -> {12}; - 12 -> {13}; - 13 -> {14}; + 12 -> {14}; + 13 -> {26}; 14 -> {15}; 15 -> {16}; - 16 -> {18 17}; - 17 -> {24}; - 18 -> {19}; + 16 -> {17}; + 17 -> {18}; + 18 -> {19 25}; 19 -> {20}; 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; - 24 -> {25}; - 25 -> {26}; + 24 -> {13}; + 25 -> {13}; 26 -> {27}; + 27 -> {9}; subgraph cluster_5 { color=red 28 [label="Enter function test_3" style="filled" fillcolor=red]; - 29 [label="Const: Null(null)"]; - 30 [label="Variable declaration: lvar x: R|kotlin/String?|"]; - 31 [label="Const: String()"]; - 32 [label="Assignmenet: R|/x|"]; - 33 [label="Access variable R|/x|"]; - 34 [label="Access variable R|kotlin/String.length|"]; - 35 [label="Const: Null(null)"]; - 36 [label="Assignmenet: R|/x|"]; - 37 [label="Access variable R|/x|"]; - 38 [label="Access variable #"]; - 39 [label="Exit 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 -> {29}; - 29 -> {30}; + 28 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; @@ -103,5 +99,6 @@ digraph smartcastAfterReassignment_kt { 36 -> {37}; 37 -> {38}; 38 -> {39}; + 39 -> {29}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/callsInPlace.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/callsInPlace.dot index d0120f9eb2f..c5e1ce5cd37 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/callsInPlace.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/callsInPlace.dot @@ -6,290 +6,279 @@ digraph callsInPlace_kt { subgraph cluster_0 { color=red 0 [label="Enter function test" style="filled" fillcolor=red]; - 1 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 2 [label="Postponed enter to lambda"]; + 2 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 3 [label="Postponed enter to lambda"]; subgraph cluster_1 { color=blue - 3 [label="Enter function anonymousFunction"]; - 4 [label="Const: Int(1)"]; - 5 [label="Assignmenet: R|/x|"]; + 5 [label="Enter function anonymousFunction"]; + 7 [label="Const: Int(1)"]; + 8 [label="Assignment: R|/x|"]; 6 [label="Exit function anonymousFunction"]; } - 7 [label="Call arguments union" style="filled" fillcolor=yellow]; - 8 [label="Postponed exit from lambda"]; + 10 [label="Call arguments union" style="filled" fillcolor=yellow]; + 4 [label="Postponed exit from lambda"]; 9 [label="Function call: R|kotlin/run|(...)"]; - 10 [label="Access variable R|/x|"]; - 11 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 12 [label="Exit function test" style="filled" fillcolor=red]; + 11 [label="Access variable R|/x|"]; + 12 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 1 [label="Exit function test" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; 2 -> {3}; - 2 -> {8} [color=red]; - 3 -> {4}; - 4 -> {5}; - 5 -> {6}; - 6 -> {8} [color=green]; - 6 -> {7} [color=red]; - 7 -> {9} [color=red]; - 8 -> {9} [color=green]; - 9 -> {10}; - 10 -> {11}; + 3 -> {5}; + 3 -> {4} [color=red]; + 4 -> {9} [color=green]; + 5 -> {7}; + 6 -> {4} [color=green]; + 6 -> {10} [color=red]; + 7 -> {8}; + 8 -> {6}; + 9 -> {11}; + 10 -> {9} [color=red]; 11 -> {12}; + 12 -> {1}; subgraph cluster_2 { color=red 13 [label="Enter function test_2" style="filled" fillcolor=red]; - 14 [label="Const: Int(10)"]; - 15 [label="Postponed enter to lambda"]; + 15 [label="Const: Int(10)"]; + 16 [label="Postponed enter to lambda"]; subgraph cluster_3 { color=blue - 16 [label="Enter function anonymousFunction"]; - 17 [label="Const: String(test_2)"]; - 18 [label="Exit function anonymousFunction"]; + 18 [label="Enter function anonymousFunction"]; + 20 [label="Const: String(test_2)"]; + 19 [label="Exit function anonymousFunction"]; } - 19 [label="Postponed exit from lambda"]; - 20 [label="Function call: R|kotlin/repeat|(...)"]; - 21 [label="Exit function test_2" style="filled" fillcolor=red]; + 17 [label="Postponed exit from lambda"]; + 21 [label="Function call: R|kotlin/repeat|(...)"]; + 14 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 13 -> {14}; - 14 -> {15}; + 13 -> {15}; 15 -> {16}; - 15 -> {19} [color=red]; - 16 -> {18 17}; - 17 -> {18}; - 18 -> {16}; - 18 -> {19} [color=green]; - 19 -> {20}; - 20 -> {21}; + 16 -> {18}; + 16 -> {17} [color=red]; + 17 -> {21}; + 18 -> {19 20}; + 19 -> {18}; + 19 -> {17} [color=green]; + 20 -> {19}; + 21 -> {14}; subgraph cluster_4 { color=red 22 [label="Enter function test_3" style="filled" fillcolor=red]; - 23 [label="Postponed enter to lambda"]; + 24 [label="Postponed enter to lambda"]; subgraph cluster_5 { color=blue - 24 [label="Enter function anonymousFunction"]; - 25 [label="Const: String(test_3)"]; - 26 [label="Exit function anonymousFunction"]; + 27 [label="Enter function anonymousFunction"]; + 29 [label="Const: String(test_3)"]; + 28 [label="Exit function anonymousFunction"]; } - 27 [label="Postponed exit from lambda"]; - 28 [label="Const: Int(10)"]; - 29 [label="Function call: R|kotlin/repeat|(...)"]; - 30 [label="Exit function test_3" style="filled" fillcolor=red]; + 25 [label="Postponed exit from lambda"]; + 26 [label="Const: Int(10)"]; + 30 [label="Function call: R|kotlin/repeat|(...)"]; + 23 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 22 -> {23}; - 23 -> {24}; - 23 -> {27} [color=red]; - 24 -> {26 25}; + 22 -> {24}; + 24 -> {27}; + 24 -> {25} [color=red]; 25 -> {26}; - 26 -> {24}; - 26 -> {27} [color=green]; - 27 -> {28}; - 28 -> {29}; - 29 -> {30}; + 26 -> {30}; + 27 -> {28 29}; + 28 -> {27}; + 28 -> {25} [color=green]; + 29 -> {28}; + 30 -> {23}; subgraph cluster_6 { color=red 31 [label="Enter function test_4" style="filled" fillcolor=red]; - 32 [label="Const: Int(1)"]; - 33 [label="Postponed enter to lambda"]; + 33 [label="Const: Int(1)"]; + 34 [label="Postponed enter to lambda"]; subgraph cluster_7 { color=blue - 34 [label="Enter function anonymousFunction"]; - 35 [label="Const: String(test_4)"]; - 36 [label="Access variable R|/it|"]; - 37 [label="Const: Int(0)"]; - 38 [label="Function call: R|/it|.R|kotlin/Int.compareTo|(...)"]; - 39 [label="Comparison >"]; - 40 [label="Exit function anonymousFunction"]; + 36 [label="Enter function anonymousFunction"]; + 38 [label="Const: String(test_4)"]; + 39 [label="Access variable R|/it|"]; + 40 [label="Const: Int(0)"]; + 41 [label="Function call: R|/it|.R|kotlin/Int.compareTo|(...)"]; + 42 [label="Comparison >"]; + 37 [label="Exit function anonymousFunction"]; } - 41 [label="Call arguments union" style="filled" fillcolor=yellow]; - 42 [label="Postponed exit from lambda"]; + 44 [label="Call arguments union" style="filled" fillcolor=yellow]; + 35 [label="Postponed exit from lambda"]; 43 [label="Function call: Int(1).R|kotlin/takeUnless|(...)"]; - 44 [label="Exit function test_4" style="filled" fillcolor=red]; + 32 [label="Exit function test_4" style="filled" fillcolor=red]; } - - 31 -> {32}; - 32 -> {33}; + 31 -> {33}; 33 -> {34}; - 33 -> {42} [color=red]; - 34 -> {35}; - 35 -> {36}; - 36 -> {37}; - 37 -> {38}; + 34 -> {36}; + 34 -> {35} [color=red]; + 35 -> {43} [color=green]; + 36 -> {38}; + 37 -> {35} [color=green]; + 37 -> {44} [color=red]; 38 -> {39}; 39 -> {40}; - 40 -> {42} [color=green]; - 40 -> {41} [color=red]; - 41 -> {43} [color=red]; - 42 -> {43} [color=green]; - 43 -> {44}; + 40 -> {41}; + 41 -> {42}; + 42 -> {37}; + 43 -> {32}; + 44 -> {43} [color=red]; subgraph cluster_8 { color=red 45 [label="Enter function test_5" style="filled" fillcolor=red]; - 46 [label="Const: Int(1)"]; - 47 [label="Postponed enter to lambda"]; + 47 [label="Const: Int(1)"]; + 48 [label="Postponed enter to lambda"]; subgraph cluster_9 { color=blue - 48 [label="Enter function anonymousFunction"]; - 49 [label="Const: String(test_5)"]; - 50 [label="Access variable R|/it|"]; - 51 [label="Const: Int(0)"]; - 52 [label="Function call: R|/it|.R|kotlin/Int.compareTo|(...)"]; - 53 [label="Comparison >"]; - 54 [label="Exit function anonymousFunction"]; + 50 [label="Enter function anonymousFunction"]; + 52 [label="Const: String(test_5)"]; + 53 [label="Access variable R|/it|"]; + 54 [label="Const: Int(0)"]; + 55 [label="Function call: R|/it|.R|kotlin/Int.compareTo|(...)"]; + 56 [label="Comparison >"]; + 51 [label="Exit function anonymousFunction"]; } - 55 [label="Call arguments union" style="filled" fillcolor=yellow]; - 56 [label="Postponed exit from lambda"]; + 58 [label="Call arguments union" style="filled" fillcolor=yellow]; + 49 [label="Postponed exit from lambda"]; 57 [label="Function call: Int(1).R|kotlin/takeUnless|(...)"]; - 58 [label="Exit function test_5" style="filled" fillcolor=red]; + 46 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 45 -> {46}; - 46 -> {47}; + 45 -> {47}; 47 -> {48}; - 47 -> {56} [color=red]; - 48 -> {49}; - 49 -> {50}; - 50 -> {51}; - 51 -> {52}; + 48 -> {50}; + 48 -> {49} [color=red]; + 49 -> {57} [color=green]; + 50 -> {52}; + 51 -> {49} [color=green]; + 51 -> {58} [color=red]; 52 -> {53}; 53 -> {54}; - 54 -> {56} [color=green]; - 54 -> {55} [color=red]; - 55 -> {57} [color=red]; - 56 -> {57} [color=green]; - 57 -> {58}; + 54 -> {55}; + 55 -> {56}; + 56 -> {51}; + 57 -> {46}; + 58 -> {57} [color=red]; subgraph cluster_10 { color=red 59 [label="Enter function myRun" style="filled" fillcolor=red]; - 60 [label="Function call: R|/block1|.R|FakeOverride|()"]; - 61 [label="Function call: R|/block2|.R|FakeOverride|()"]; - 62 [label="Exit 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 -> {60}; - 60 -> {61}; + 59 -> {61}; 61 -> {62}; + 62 -> {60}; subgraph cluster_11 { color=red 63 [label="Enter function test_6" style="filled" fillcolor=red]; - 64 [label="Postponed enter to lambda"]; + 65 [label="Postponed enter to lambda"]; subgraph cluster_12 { color=blue - 65 [label="Enter function anonymousFunction"]; - 66 [label="Const: String(test_6_1)"]; - 67 [label="Exit function anonymousFunction"]; + 69 [label="Enter function anonymousFunction"]; + 71 [label="Const: String(test_6_1)"]; + 70 [label="Exit function anonymousFunction"]; } - 68 [label="Postponed exit from lambda"]; - 69 [label="Postponed enter to lambda"]; + 66 [label="Postponed exit from lambda"]; + 67 [label="Postponed enter to lambda"]; subgraph cluster_13 { color=blue - 70 [label="Enter function anonymousFunction"]; - 71 [label="Const: String(test_6_2)"]; - 72 [label="Exit function anonymousFunction"]; + 72 [label="Enter function anonymousFunction"]; + 74 [label="Const: String(test_6_2)"]; + 73 [label="Exit function anonymousFunction"]; } - 73 [label="Postponed exit from lambda"]; - 74 [label="Function call: R|/myRun|(...)"]; - 75 [label="Exit function test_6" style="filled" fillcolor=red]; + 68 [label="Postponed exit from lambda"]; + 75 [label="Function call: R|/myRun|(...)"]; + 64 [label="Exit function test_6" style="filled" fillcolor=red]; } - - 63 -> {64}; - 64 -> {65}; - 64 -> {68} [color=red]; - 65 -> {67 66}; + 63 -> {65}; + 65 -> {69}; + 65 -> {66} [color=red]; 66 -> {67}; - 67 -> {65}; - 67 -> {68} [color=green]; - 68 -> {69}; - 69 -> {70}; - 69 -> {73} [color=red]; - 70 -> {72 71}; - 71 -> {72}; - 72 -> {70}; - 72 -> {73} [color=green]; - 73 -> {74}; - 74 -> {75}; + 67 -> {72}; + 67 -> {68} [color=red]; + 68 -> {75}; + 69 -> {70 71}; + 70 -> {69}; + 70 -> {66} [color=green]; + 71 -> {70}; + 72 -> {73 74}; + 73 -> {72}; + 73 -> {68} [color=green]; + 74 -> {73}; + 75 -> {64}; subgraph cluster_14 { color=red 76 [label="Enter function test_7" style="filled" fillcolor=red]; - 77 [label="Postponed enter to lambda"]; + 78 [label="Postponed enter to lambda"]; subgraph cluster_15 { color=blue - 78 [label="Enter function anonymousFunction"]; - 79 [label="Const: String(test_7_2)"]; - 80 [label="Exit function anonymousFunction"]; + 82 [label="Enter function anonymousFunction"]; + 84 [label="Const: String(test_7_2)"]; + 83 [label="Exit function anonymousFunction"]; } - 81 [label="Postponed exit from lambda"]; - 82 [label="Postponed enter to lambda"]; + 79 [label="Postponed exit from lambda"]; + 80 [label="Postponed enter to lambda"]; subgraph cluster_16 { color=blue - 83 [label="Enter function anonymousFunction"]; - 84 [label="Const: String(test_7_1)"]; - 85 [label="Exit function anonymousFunction"]; + 85 [label="Enter function anonymousFunction"]; + 87 [label="Const: String(test_7_1)"]; + 86 [label="Exit function anonymousFunction"]; } - 86 [label="Postponed exit from lambda"]; - 87 [label="Function call: R|/myRun|(...)"]; - 88 [label="Exit function test_7" style="filled" fillcolor=red]; + 81 [label="Postponed exit from lambda"]; + 88 [label="Function call: R|/myRun|(...)"]; + 77 [label="Exit function test_7" style="filled" fillcolor=red]; } - - 76 -> {77}; - 77 -> {78}; - 77 -> {81} [color=red]; - 78 -> {80 79}; + 76 -> {78}; + 78 -> {82}; + 78 -> {79} [color=red]; 79 -> {80}; - 80 -> {78}; - 80 -> {81} [color=green]; - 81 -> {82}; - 82 -> {83}; - 82 -> {86} [color=red]; - 83 -> {85 84}; - 84 -> {85}; - 85 -> {83}; - 85 -> {86} [color=green]; - 86 -> {87}; - 87 -> {88}; + 80 -> {85}; + 80 -> {81} [color=red]; + 81 -> {88}; + 82 -> {83 84}; + 83 -> {82}; + 83 -> {79} [color=green]; + 84 -> {83}; + 85 -> {86 87}; + 86 -> {85}; + 86 -> {81} [color=green]; + 87 -> {86}; + 88 -> {77}; subgraph cluster_17 { color=red 89 [label="Enter function myDummyRun" style="filled" fillcolor=red]; - 90 [label="Function call: R|/block|.R|FakeOverride|()"]; - 91 [label="Exit function myDummyRun" style="filled" fillcolor=red]; + 91 [label="Function call: R|/block|.R|FakeOverride|()"]; + 90 [label="Exit function myDummyRun" style="filled" fillcolor=red]; } - - 89 -> {90}; - 90 -> {91}; + 89 -> {91}; + 91 -> {90}; subgraph cluster_18 { color=red 92 [label="Enter function test_8" style="filled" fillcolor=red]; - 93 [label="Postponed enter to lambda"]; - 94 [label="Postponed exit from lambda"]; - 95 [label="Function call: R|/myDummyRun|(...)"]; - 96 [label="Exit function test_8" style="filled" fillcolor=red]; + 94 [label="Postponed enter to lambda"]; + subgraph cluster_19 { + 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]; + } + 95 [label="Postponed exit from lambda"]; + 96 [label="Function call: R|/myDummyRun|(...)"]; + 93 [label="Exit function test_8" style="filled" fillcolor=red]; } - - 92 -> {93}; - 93 -> {94 94} [color=green]; - 94 -> {95}; + 92 -> {94}; + 94 -> {95 95} [color=green]; + 94 -> {97} [color=red]; 95 -> {96}; - - subgraph cluster_19 { - color=red - 97 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 98 [label="Const: String(test_8)"]; - 99 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 97 -> {98}; - 98 -> {99}; + 96 -> {93}; + 97 -> {99}; + 99 -> {98}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/conditionalEffects.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/conditionalEffects.dot index a5afe765547..c18e4489432 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/conditionalEffects.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/conditionalEffects.dot @@ -6,23 +6,21 @@ digraph conditionalEffects_kt { subgraph cluster_0 { color=red 0 [label="Enter function test_1" style="filled" fillcolor=red]; - 1 [label="Access variable R|/x|"]; - 2 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 3 [label="Function call: R|kotlin/require|(...)"]; + 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 - 4 [label="Enter contract"]; - 5 [label="Access variable R|/x|"]; - 6 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 7 [label="Exit contract"]; + 5 [label="Enter contract"]; + 6 [label="Access variable R|/x|"]; + 7 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; + 8 [label="Exit contract"]; } - 8 [label="Access variable R|/x|"]; - 9 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 10 [label="Exit function test_1" style="filled" fillcolor=red]; + 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 -> {1}; - 1 -> {2}; + 0 -> {2}; 2 -> {3}; 3 -> {4}; 4 -> {5}; @@ -31,27 +29,26 @@ digraph conditionalEffects_kt { 7 -> {8}; 8 -> {9}; 9 -> {10}; + 10 -> {1}; subgraph cluster_2 { color=red 11 [label="Enter function test_2" style="filled" fillcolor=red]; - 12 [label="Access variable R|/x|"]; - 13 [label="Function call: R|kotlin/requireNotNull|(...)"]; + 13 [label="Access variable R|/x|"]; + 14 [label="Function call: R|kotlin/requireNotNull|(...)"]; subgraph cluster_3 { color=blue - 14 [label="Enter contract"]; - 15 [label="Access variable R|/x|"]; - 16 [label="Const: Null(null)"]; - 17 [label="Operator !="]; - 18 [label="Exit contract"]; + 15 [label="Enter contract"]; + 16 [label="Access variable R|/x|"]; + 17 [label="Const: Null(null)"]; + 18 [label="Operator !="]; + 19 [label="Exit contract"]; } - 19 [label="Access variable R|/x|"]; - 20 [label="Access variable R|kotlin/String.length|"]; - 21 [label="Exit function test_2" style="filled" fillcolor=red]; + 20 [label="Access variable R|/x|"]; + 21 [label="Access variable R|kotlin/String.length|"]; + 12 [label="Exit function test_2" style="filled" fillcolor=red]; } - - 11 -> {12}; - 12 -> {13}; + 11 -> {13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; @@ -60,29 +57,28 @@ digraph conditionalEffects_kt { 18 -> {19}; 19 -> {20}; 20 -> {21}; + 21 -> {12}; subgraph cluster_4 { color=red 22 [label="Enter function test_3" style="filled" fillcolor=red]; - 23 [label="Access variable R|/x|"]; - 24 [label="Const: Null(null)"]; - 25 [label="Operator !="]; - 26 [label="Function call: R|kotlin/require|(...)"]; + 24 [label="Access variable R|/x|"]; + 25 [label="Const: Null(null)"]; + 26 [label="Operator !="]; + 27 [label="Function call: R|kotlin/require|(...)"]; subgraph cluster_5 { color=blue - 27 [label="Enter contract"]; - 28 [label="Access variable R|/x|"]; - 29 [label="Const: Null(null)"]; - 30 [label="Operator !="]; - 31 [label="Exit contract"]; + 28 [label="Enter contract"]; + 29 [label="Access variable R|/x|"]; + 30 [label="Const: Null(null)"]; + 31 [label="Operator !="]; + 32 [label="Exit contract"]; } - 32 [label="Access variable R|/x|"]; - 33 [label="Access variable R|kotlin/String.length|"]; - 34 [label="Exit function test_3" style="filled" fillcolor=red]; + 33 [label="Access variable R|/x|"]; + 34 [label="Access variable R|kotlin/String.length|"]; + 23 [label="Exit function test_3" style="filled" fillcolor=red]; } - - 22 -> {23}; - 23 -> {24}; + 22 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; @@ -93,146 +89,144 @@ digraph conditionalEffects_kt { 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 - 36 [label="Enter &&"]; - 37 [label="Access variable R|/x|"]; - 38 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 39 [label="Exit left part of &&"]; - 40 [label="Enter right part of &&"]; - 41 [label="Access variable R|/y|"]; - 42 [label="Const: Null(null)"]; - 43 [label="Operator !="]; - 44 [label="Exit &&"]; + 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 &&"]; } - 45 [label="Function call: R|kotlin/require|(...)"]; + 46 [label="Function call: R|kotlin/require|(...)"]; subgraph cluster_8 { color=blue - 46 [label="Enter contract"]; + 47 [label="Enter contract"]; subgraph cluster_9 { color=blue - 47 [label="Enter &&"]; - 48 [label="Access variable R|/x|"]; - 49 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 50 [label="Exit left part of &&"]; - 51 [label="Enter right part of &&"]; - 52 [label="Access variable R|/y|"]; - 53 [label="Const: Null(null)"]; - 54 [label="Operator !="]; - 55 [label="Exit &&"]; + 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 &&"]; } - 56 [label="Exit contract"]; + 57 [label="Exit contract"]; } - 57 [label="Access variable R|/x|"]; - 58 [label="Access variable R|kotlin/String.length|"]; - 59 [label="Access variable R|/y|"]; - 60 [label="Access variable R|kotlin/String.length|"]; - 61 [label="Exit function test_4" style="filled" fillcolor=red]; + 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 -> {36}; - 36 -> {37}; - 37 -> {38}; + 35 -> {38}; + 37 -> {46}; 38 -> {39}; - 39 -> {44 40}; + 39 -> {40}; 40 -> {41}; - 41 -> {42}; + 41 -> {37 42}; 42 -> {43}; 43 -> {44}; 44 -> {45}; - 45 -> {46}; + 45 -> {37}; 46 -> {47}; - 47 -> {48}; - 48 -> {49}; + 47 -> {49}; + 48 -> {57}; 49 -> {50}; - 50 -> {55 51}; + 50 -> {51}; 51 -> {52}; - 52 -> {53}; + 52 -> {48 53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; - 56 -> {57}; + 56 -> {48}; 57 -> {58}; 58 -> {59}; 59 -> {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 - 63 [label="Enter when"]; + 64 [label="Enter when"]; subgraph cluster_12 { color=blue - 64 [label="Enter when branch condition "]; - 65 [label="Access variable R|/b|"]; - 66 [label="Exit when branch condition"]; + 66 [label="Enter when branch condition "]; + 67 [label="Access variable R|/b|"]; + 68 [label="Exit when branch condition"]; } subgraph cluster_13 { color=blue - 67 [label="Enter when branch condition else"]; - 68 [label="Exit when branch condition"]; + 82 [label="Enter when branch condition else"]; + 83 [label="Exit when branch condition"]; } - 69 [label="Enter when branch result"]; + 84 [label="Enter when branch result"]; subgraph cluster_14 { color=blue - 70 [label="Enter block"]; - 71 [label="Access variable R|/x|"]; - 72 [label="Access variable #"]; - 73 [label="Exit block"]; + 85 [label="Enter block"]; + 86 [label="Access variable R|/x|"]; + 87 [label="Access variable #"]; + 88 [label="Exit block"]; } - 74 [label="Exit when branch result"]; - 75 [label="Enter when branch result"]; + 89 [label="Exit when branch result"]; + 69 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 76 [label="Enter block"]; - 77 [label="Access variable R|/x|"]; - 78 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 79 [label="Function call: R|kotlin/require|(...)"]; + 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 - 80 [label="Enter contract"]; - 81 [label="Access variable R|/x|"]; - 82 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 83 [label="Exit contract"]; + 74 [label="Enter contract"]; + 75 [label="Access variable R|/x|"]; + 76 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 77 [label="Exit contract"]; } - 84 [label="Access variable R|/x|"]; - 85 [label="Access variable R|kotlin/String.length|"]; - 86 [label="Exit block"]; + 78 [label="Access variable R|/x|"]; + 79 [label="Access variable R|kotlin/String.length|"]; + 80 [label="Exit block"]; } - 87 [label="Exit when branch result"]; - 88 [label="Exit when"]; + 81 [label="Exit when branch result"]; + 65 [label="Exit when"]; } - 89 [label="Access variable R|/x|"]; - 90 [label="Access variable #"]; - 91 [label="Exit function test_5" style="filled" fillcolor=red]; + 90 [label="Access variable R|/x|"]; + 91 [label="Access variable #"]; + 63 [label="Exit function test_5" style="filled" fillcolor=red]; } - - 62 -> {63}; - 63 -> {64}; - 64 -> {65}; - 65 -> {66}; - 66 -> {75 67}; + 62 -> {64}; + 64 -> {66}; + 65 -> {90}; + 66 -> {67}; 67 -> {68}; - 68 -> {69}; + 68 -> {69 82}; 69 -> {70}; 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; - 74 -> {88}; + 74 -> {75}; 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; 80 -> {81}; - 81 -> {82}; + 81 -> {65}; 82 -> {83}; 83 -> {84}; 84 -> {85}; @@ -240,34 +234,54 @@ digraph conditionalEffects_kt { 86 -> {87}; 87 -> {88}; 88 -> {89}; - 89 -> {90}; + 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 - 93 [label="Enter when"]; + 94 [label="Enter when"]; subgraph cluster_19 { color=blue - 94 [label="Enter when branch condition "]; - 95 [label="Access variable R|/b|"]; - 96 [label="Exit when branch condition"]; + 96 [label="Enter when branch condition "]; + 97 [label="Access variable R|/b|"]; + 98 [label="Exit when branch condition"]; } subgraph cluster_20 { color=blue - 97 [label="Enter when branch condition else"]; - 98 [label="Exit when branch condition"]; + 112 [label="Enter when branch condition else"]; + 113 [label="Exit when branch condition"]; } - 99 [label="Enter when branch result"]; + 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_22 { + subgraph cluster_24 { color=blue 104 [label="Enter contract"]; 105 [label="Access variable R|/x|"]; @@ -279,39 +293,18 @@ digraph conditionalEffects_kt { 110 [label="Exit block"]; } 111 [label="Exit when branch result"]; - 112 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 113 [label="Enter block"]; - 114 [label="Access variable R|/x|"]; - 115 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 116 [label="Function call: R|kotlin/require|(...)"]; - subgraph cluster_24 { - color=blue - 117 [label="Enter contract"]; - 118 [label="Access variable R|/x|"]; - 119 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 120 [label="Exit contract"]; - } - 121 [label="Access variable R|/x|"]; - 122 [label="Access variable R|kotlin/String.length|"]; - 123 [label="Exit block"]; - } - 124 [label="Exit when branch result"]; - 125 [label="Exit when"]; + 95 [label="Exit when"]; } - 126 [label="Access variable R|/x|"]; - 127 [label="Access variable R|kotlin/String.length|"]; - 128 [label="Exit function test_6" style="filled" fillcolor=red]; + 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 -> {93}; - 93 -> {94}; - 94 -> {95}; - 95 -> {96}; - 96 -> {112 97}; + 92 -> {94}; + 94 -> {96}; + 95 -> {127}; + 96 -> {97}; 97 -> {98}; - 98 -> {99}; + 98 -> {99 112}; 99 -> {100}; 100 -> {101}; 101 -> {102}; @@ -324,7 +317,7 @@ digraph conditionalEffects_kt { 108 -> {109}; 109 -> {110}; 110 -> {111}; - 111 -> {125}; + 111 -> {95}; 112 -> {113}; 113 -> {114}; 114 -> {115}; @@ -339,7 +332,8 @@ digraph conditionalEffects_kt { 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {127}; + 126 -> {95}; 127 -> {128}; + 128 -> {93}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot index 8042ca1a7eb..0433c672260 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot @@ -6,54 +6,49 @@ digraph delegateWithAnonymousObject_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Delegated constructor call: super()"]; - 2 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Delegated constructor call: super()"]; + 1 [label="Exit function " style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; + 0 -> {2}; + 2 -> {1}; subgraph cluster_1 { color=red 3 [label="Enter class DelegateProvider" style="filled" fillcolor=red]; 4 [label="Exit class DelegateProvider" style="filled" fillcolor=red]; } - 3 -> {4} [color=green]; subgraph cluster_2 { color=red 5 [label="Enter function delegate" style="filled" fillcolor=red]; - 6 [label="Const: Null(null)"]; - 7 [label="Check not null: Null(null)!!"]; - 8 [label="Jump: ^delegate Null(null)!!"]; - 9 [label="Stub" style="filled" fillcolor=gray]; - 10 [label="Exit 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]; + 6 [label="Exit function delegate" style="filled" fillcolor=red]; } - - 5 -> {6}; - 6 -> {7}; + 5 -> {7}; 7 -> {8}; - 8 -> {10}; - 8 -> {9} [style=dotted]; + 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]; - 12 [label="Delegated constructor call: super|>()"]; - 13 [label="Exit function " style="filled" fillcolor=red]; + 13 [label="Delegated constructor call: super|>()"]; + 12 [label="Exit function " style="filled" fillcolor=red]; } - - 11 -> {12}; - 12 -> {13}; + 11 -> {13}; + 13 -> {12}; subgraph cluster_4 { color=red 14 [label="Enter function updateFrom" style="filled" fillcolor=red]; 15 [label="Exit function updateFrom" style="filled" fillcolor=red]; } - 14 -> {15}; subgraph cluster_5 { @@ -61,149 +56,139 @@ digraph delegateWithAnonymousObject_kt { 16 [label="Enter class IssueListView" style="filled" fillcolor=red]; 17 [label="Exit class IssueListView" style="filled" fillcolor=red]; } - 16 -> {17} [color=green]; subgraph cluster_6 { color=red 18 [label="Enter function " style="filled" fillcolor=red]; - 19 [label="Delegated constructor call: super|>()"]; - 20 [label="Exit function " style="filled" fillcolor=red]; + 20 [label="Delegated constructor call: super|>()"]; + 19 [label="Exit function " style="filled" fillcolor=red]; } - - 18 -> {19}; - 19 -> {20}; + 18 -> {20}; + 20 -> {19}; subgraph cluster_7 { - color=red - 21 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 22 [label="Exit anonymous object"]; - 23 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 21 -> {22}; - 22 -> {23}; - - subgraph cluster_8 { color=red 24 [label="Enter function " style="filled" fillcolor=red]; - 25 [label="Delegated constructor call: super()"]; - 26 [label="Exit function " style="filled" fillcolor=red]; + 26 [label="Delegated constructor call: super()"]; + 25 [label="Exit function " style="filled" fillcolor=red]; } + 24 -> {26}; + 26 -> {25}; - 24 -> {25}; - 25 -> {26}; - - subgraph cluster_9 { + subgraph cluster_8 { color=red 27 [label="Enter function getValue" style="filled" fillcolor=red]; - 28 [label="Function call: R|/IssueListView.IssueListView|()"]; - 29 [label="Jump: ^getValue R|/IssueListView.IssueListView|()"]; - 30 [label="Stub" style="filled" fillcolor=gray]; - 31 [label="Exit function getValue" style="filled" fillcolor=red]; - } - - 27 -> {28}; - 28 -> {29}; - 29 -> {31}; - 29 -> {30} [style=dotted]; + 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]; + } + 27 -> {29}; + 29 -> {30}; + 30 -> {28}; 30 -> {31} [style=dotted]; + 31 -> {28} [style=dotted]; - subgraph cluster_10 { + subgraph cluster_9 { color=red 32 [label="Enter function setValue" style="filled" fillcolor=red]; - 33 [label="Function call: R|/IssueListView.IssueListView|()"]; - 34 [label="Access variable R|/value|"]; - 35 [label="Function call: R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(...)"]; - 36 [label="Jump: ^setValue R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(R|/value|)"]; - 37 [label="Stub" style="filled" fillcolor=gray]; - 38 [label="Exit function setValue" style="filled" fillcolor=red]; - } - - 32 -> {33}; - 33 -> {34}; + 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 -> {34}; 34 -> {35}; 35 -> {36}; - 36 -> {38}; - 36 -> {37} [style=dotted]; + 36 -> {37}; + 37 -> {33}; 37 -> {38} [style=dotted]; + 38 -> {33} [style=dotted]; - subgraph cluster_11 { + 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_12 { - color=red - 41 [label="Enter function getter" style="filled" fillcolor=red]; - 42 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 43 [label="Access variable this@R|/IssuesListUserProfile|"]; - 44 [label="Function call: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; - 45 [label="Jump: ^ D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; - 46 [label="Stub" style="filled" fillcolor=gray]; - 47 [label="Exit function getter" style="filled" fillcolor=red]; - } - - 41 -> {42}; - 42 -> {43}; - 43 -> {44}; - 44 -> {45}; - 45 -> {47}; - 45 -> {46} [style=dotted]; - 46 -> {47} [style=dotted]; - - subgraph cluster_13 { - color=red - 48 [label="Enter function setter" style="filled" fillcolor=red]; - 49 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 50 [label="Access variable this@R|/IssuesListUserProfile|"]; - 51 [label="Access variable R|/issueListView|"]; - 52 [label="Function call: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; - 53 [label="Exit function setter" style="filled" fillcolor=red]; - } - - 48 -> {49}; - 49 -> {50}; - 50 -> {51}; - 51 -> {52}; - 52 -> {53}; - - subgraph cluster_14 { + subgraph cluster_11 { color=red - 54 [label="Enter property" style="filled" fillcolor=red]; - 55 [label="Postponed enter to lambda"]; - 56 [label="Postponed exit from lambda"]; - 57 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; - 58 [label="Access variable this@R|/IssuesListUserProfile|"]; - 59 [label="Access variable this@R|/IssuesListUserProfile|"]; - 60 [label="Access variable this@R|/IssuesListUserProfile|"]; - 61 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...).#(...)"]; - 62 [label="Postponed enter to lambda"]; - 63 [label="Postponed exit from lambda"]; - 64 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; - 65 [label="Exit property" style="filled" fillcolor=red]; + 66 [label="Enter class IssuesListUserProfile" style="filled" fillcolor=red]; + subgraph cluster_12 { + 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="Access variable this@R|/IssuesListUserProfile|"]; + 61 [label="Access variable this@R|/IssuesListUserProfile|"]; + 62 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...).#(...)"]; + 63 [label="Postponed enter to lambda"]; + subgraph cluster_13 { + 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]; + } + 64 [label="Postponed exit from lambda"]; + 65 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; + 55 [label="Exit property" style="filled" fillcolor=red]; + } + subgraph cluster_14 { + 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: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; + 49 [label="Exit function setter" style="filled" fillcolor=red]; + } + subgraph cluster_15 { + 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: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; + 46 [label="Jump: ^ 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]; + } + 67 [label="Exit class IssuesListUserProfile" style="filled" fillcolor=red]; } - - 54 -> {55}; - 55 -> {56 56} [color=green]; - 56 -> {57}; + 66 -> {54} [color=green]; + 54 -> {56}; + 55 -> {67} [color=green]; + 56 -> {57 57} [color=green]; 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; - 62 -> {63 63} [color=green]; - 63 -> {64}; + 62 -> {63}; + 63 -> {64 64} [color=green]; + 63 -> {21} [color=red]; 64 -> {65}; - - subgraph cluster_15 { - color=red - 66 [label="Enter class IssuesListUserProfile" style="filled" fillcolor=red]; - 67 [label="Exit class IssuesListUserProfile" style="filled" fillcolor=red]; - } - + 65 -> {55}; + 65 -> {41 48} [color=red]; + 21 -> {23}; + 21 -> {24 27 32} [color=red]; + 23 -> {22}; + 41 -> {43}; + 43 -> {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}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot index 0653178bfe9..38dc8eef109 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot @@ -6,24 +6,22 @@ digraph tryWithLambdaInside_kt { subgraph cluster_0 { color=red 0 [label="Enter function notInPlaceFilter" style="filled" fillcolor=red]; - 1 [label="Access variable this@R|/notInPlaceFilter|"]; - 2 [label="Jump: ^notInPlaceFilter this@R|/notInPlaceFilter|"]; - 3 [label="Stub" style="filled" fillcolor=gray]; - 4 [label="Exit 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]; + 1 [label="Exit function notInPlaceFilter" style="filled" fillcolor=red]; } - - 0 -> {1}; - 1 -> {2}; - 2 -> {4}; - 2 -> {3} [style=dotted]; + 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}; subgraph cluster_2 { @@ -31,40 +29,40 @@ digraph tryWithLambdaInside_kt { 7 [label="Enter function testInPlace" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 8 [label="Try expression enter"]; + 9 [label="Try expression enter"]; subgraph cluster_4 { color=blue - 9 [label="Try main block enter"]; + 11 [label="Try main block enter"]; subgraph cluster_5 { color=blue - 10 [label="Enter block"]; - 11 [label="Access variable R|/list|"]; - 12 [label="Postponed enter to lambda"]; + 13 [label="Enter block"]; + 14 [label="Access variable R|/list|"]; + 15 [label="Postponed enter to lambda"]; subgraph cluster_6 { color=blue - 13 [label="Enter function anonymousFunction"]; - 14 [label="Access variable R|/it|"]; - 15 [label="Exit function anonymousFunction"]; + 17 [label="Enter function anonymousFunction"]; + 19 [label="Access variable R|/it|"]; + 18 [label="Exit function anonymousFunction"]; } 16 [label="Postponed exit from lambda"]; - 17 [label="Function call: R|/list|.R|kotlin/collections/filter|(...)"]; - 18 [label="Exit block"]; + 20 [label="Function call: R|/list|.R|kotlin/collections/filter|(...)"]; + 21 [label="Exit block"]; } - 19 [label="Try main block exit"]; + 22 [label="Try main block exit"]; } subgraph cluster_7 { color=blue - 20 [label="Enter finally"]; + 12 [label="Enter finally"]; subgraph cluster_8 { color=blue - 21 [label="Enter block"]; - 22 [label="Exit block"]; + 23 [label="Enter block"]; + 24 [label="Exit block"]; } - 23 [label="Exit finally"]; + 25 [label="Exit finally"]; } - 24 [label="Try expression exit"]; + 10 [label="Try expression exit"]; } - 25 [label="Jump: ^testInPlace try { + 26 [label="Jump: ^testInPlace try { R|/list|.R|kotlin/collections/filter|( = filter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { ^ R|/it| } @@ -73,67 +71,72 @@ digraph tryWithLambdaInside_kt { finally { } "]; - 26 [label="Stub" style="filled" fillcolor=gray]; - 27 [label="Exit function testInPlace" style="filled" fillcolor=red]; + 27 [label="Stub" style="filled" fillcolor=gray]; + 8 [label="Exit function testInPlace" style="filled" fillcolor=red]; } - - 7 -> {8}; - 8 -> {9}; - 9 -> {27 20 10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {13}; - 12 -> {16} [color=red]; - 13 -> {15 14}; + 7 -> {9}; + 9 -> {11}; + 10 -> {26}; + 11 -> {8 12 13}; + 12 -> {23}; + 13 -> {14}; 14 -> {15}; - 15 -> {13}; - 15 -> {16} [color=green]; - 16 -> {17}; - 17 -> {18}; - 18 -> {19}; - 19 -> {24}; + 15 -> {17}; + 15 -> {16} [color=red]; + 16 -> {20}; + 17 -> {18 19}; + 18 -> {17}; + 18 -> {16} [color=green]; + 19 -> {18}; 20 -> {21}; 21 -> {22}; - 22 -> {23}; + 22 -> {10}; 23 -> {24}; 24 -> {25}; - 25 -> {27}; - 25 -> {26} [style=dotted]; + 25 -> {10}; + 26 -> {8}; 26 -> {27} [style=dotted]; + 27 -> {8} [style=dotted]; subgraph cluster_9 { color=red 28 [label="Enter function testNotInPlace" style="filled" fillcolor=red]; subgraph cluster_10 { color=blue - 29 [label="Try expression enter"]; + 30 [label="Try expression enter"]; subgraph cluster_11 { color=blue - 30 [label="Try main block enter"]; + 32 [label="Try main block enter"]; subgraph cluster_12 { color=blue - 31 [label="Enter block"]; - 32 [label="Access variable R|/list|"]; - 33 [label="Postponed enter to lambda"]; - 34 [label="Postponed exit from lambda"]; - 35 [label="Function call: R|/list|.R|/notInPlaceFilter|(...)"]; - 36 [label="Exit block"]; + 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"]; } - 37 [label="Try main block exit"]; + 40 [label="Try main block exit"]; } - subgraph cluster_13 { + subgraph cluster_14 { color=blue - 38 [label="Enter finally"]; - subgraph cluster_14 { + 33 [label="Enter finally"]; + subgraph cluster_15 { color=blue - 39 [label="Enter block"]; - 40 [label="Exit block"]; + 41 [label="Enter block"]; + 42 [label="Exit block"]; } - 41 [label="Exit finally"]; + 43 [label="Exit finally"]; } - 42 [label="Try expression exit"]; + 31 [label="Try expression exit"]; } - 43 [label="Jump: ^testNotInPlace try { + 44 [label="Jump: ^testNotInPlace try { R|/list|.R|/notInPlaceFilter|( = notInPlaceFilter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { ^ R|/it| } @@ -142,37 +145,29 @@ finally { finally { } "]; - 44 [label="Stub" style="filled" fillcolor=gray]; - 45 [label="Exit function testNotInPlace" style="filled" fillcolor=red]; + 45 [label="Stub" style="filled" fillcolor=gray]; + 29 [label="Exit function testNotInPlace" style="filled" fillcolor=red]; } - - 28 -> {29}; - 29 -> {30}; - 30 -> {45 38 31}; - 31 -> {32}; - 32 -> {33}; - 33 -> {34 34} [color=green]; + 28 -> {30}; + 30 -> {32}; + 31 -> {44}; + 32 -> {29 33 34}; + 33 -> {41}; 34 -> {35}; 35 -> {36}; - 36 -> {37}; - 37 -> {42}; + 36 -> {37 37} [color=green]; + 36 -> {46} [color=red]; + 37 -> {38}; 38 -> {39}; 39 -> {40}; - 40 -> {41}; + 40 -> {31}; 41 -> {42}; 42 -> {43}; - 43 -> {45}; - 43 -> {44} [style=dotted]; + 43 -> {31}; + 44 -> {29}; 44 -> {45} [style=dotted]; - - subgraph cluster_15 { - color=red - 46 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 47 [label="Access variable R|/it|"]; - 48 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - - 46 -> {47}; - 47 -> {48}; + 45 -> {29} [style=dotted]; + 46 -> {48}; + 48 -> {47}; } -- GitLab