From 8cb6e8f8afd1f66511a77e859fc6b45e01305ac2 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 27 Mar 2020 14:48:08 +0300 Subject: [PATCH] [FIR] Add control flow graph for class initialization --- .../testData/resolve/cfg/complex.dot | 306 +-- .../testData/resolve/cfg/initBlock.dot | 60 +- .../resolve/cfg/initBlockAndInPlaceLambda.dot | 110 +- .../resolve/cfg/lambdaReturningObject.dot | 92 +- .../resolve/cfg/localClassesWithImplicit.dot | 366 +-- .../cfg/postponedLambdaInConstructor.dot | 97 +- .../resolve/cfg/propertiesAndInitBlocks.dot | 188 +- .../resolve/cfg/returnValuesFromLambda.dot | 264 ++- .../testData/resolve/cfg/safeCalls.dot | 91 +- .../testData/resolve/cfg/when.dot | 102 +- .../resolve/exhaustiveWhenAndDNNType.dot | 364 +-- .../testData/resolve/smartcasts/bangbang.dot | 410 ++-- .../smartcasts/booleans/booleanOperators.dot | 1246 ++++++----- .../smartcasts/booleans/equalsToBoolean.dot | 589 ++--- .../booleans/jumpFromRhsOfOperator.dot | 546 ++--- .../boundSmartcasts/boundSmartcasts.dot | 677 +++--- .../boundSmartcastsInBranches.dot | 869 ++++---- .../boundSmartcasts/functionCallBound.dot | 151 +- .../smartcasts/controlStructures/elvis.dot | 343 +-- .../smartcasts/controlStructures/returns.dot | 494 +++-- .../smartcastFromArgument.dot | 178 +- .../smartcasts/controlStructures/when.dot | 928 ++++---- .../resolve/smartcasts/equalsAndIdentity.dot | 398 ++-- .../smartcasts/lambdas/inPlaceLambdas.dot | 276 +-- .../loops/dataFlowInfoFromWhileCondition.dot | 118 +- .../resolve/smartcasts/loops/endlessLoops.dot | 746 ++++--- .../resolve/smartcasts/multipleCasts.dot | 176 +- .../resolve/smartcasts/nullability.dot | 1969 +++++++++-------- .../receivers/implicitReceivers.dot | 658 +++--- .../receivers/thisOfExtensionProperty.dot | 141 +- .../smartcasts/safeCalls/assignSafeCall.dot | 536 ++--- .../smartcasts/safeCalls/safeCalls.dot | 242 +- .../resolve/smartcasts/smartCastInInit.dot | 97 +- .../resolve/smartcasts/smartcastToNothing.dot | 209 +- .../smartcasts/stability/overridenOpenVal.dot | 157 +- .../variables/delayedAssignment.dot | 102 +- .../delegates/delegateWithAnonymousObject.dot | 227 +- .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 27 +- .../fir/resolve/dfa/cfg/ControlFlowGraph.kt | 4 +- .../dfa/cfg/ControlFlowGraphBuilder.kt | 105 +- .../dfa/cfg/ControlFlowGraphRenderer.kt | 20 +- .../FirDeclarationsResolveTransformer.kt | 29 +- .../fir/declarations/FirDeclarationUtil.kt | 2 + 43 files changed, 7687 insertions(+), 7023 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot index db4e5bc94b8..a640b6c890d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot @@ -13,93 +13,101 @@ digraph complex_kt { subgraph cluster_1 { color=red - 2 [label="Enter function addSuppressed" style="filled" fillcolor=red]; - 3 [label="Exit function addSuppressed" style="filled" fillcolor=red]; + 2 [label="Enter class AutoCloseable" style="filled" fillcolor=red]; + 3 [label="Exit class AutoCloseable" style="filled" fillcolor=red]; } - 2 -> {3}; + 2 -> {3} [color=green]; subgraph cluster_2 { color=red - 4 [label="Enter function closeFinally" style="filled" fillcolor=red]; - subgraph cluster_3 { + 4 [label="Enter function addSuppressed" style="filled" fillcolor=red]; + 5 [label="Exit function addSuppressed" style="filled" fillcolor=red]; + } + + 4 -> {5}; + + subgraph cluster_3 { + color=red + 6 [label="Enter function closeFinally" style="filled" fillcolor=red]; + subgraph cluster_4 { color=blue - 5 [label="Enter when"]; - subgraph cluster_4 { - color=blue - 6 [label="Enter when branch condition "]; - 7 [label="Access variable this@R|/closeFinally|"]; - 8 [label="Const: Null(null)"]; - 9 [label="Operator =="]; - 10 [label="Exit when branch condition"]; - } + 7 [label="Enter when"]; subgraph cluster_5 { color=blue - 11 [label="Enter when branch condition "]; - 12 [label="Access variable R|/cause|"]; - 13 [label="Const: Null(null)"]; - 14 [label="Operator =="]; - 15 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_6 { color=blue - 16 [label="Enter when branch condition else"]; + 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"]; } - 18 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 19 [label="Enter block"]; - subgraph cluster_8 { - color=blue - 20 [label="Try expression enter"]; - subgraph cluster_9 { - color=blue - 21 [label="Try main block enter"]; - subgraph cluster_10 { - color=blue - 22 [label="Enter block"]; - 23 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; - 24 [label="Exit block"]; - } - 25 [label="Try main block exit"]; - } - subgraph cluster_11 { - color=blue - 26 [label="Catch enter"]; - subgraph cluster_12 { - color=blue - 27 [label="Enter block"]; - 28 [label="Access variable R|/cause|"]; - 29 [label="Access variable R|/closeException|"]; - 30 [label="Function call: R|/cause|.R|/addSuppressed|(...)"]; - 31 [label="Exit block"]; - } - 32 [label="Catch exit"]; - } - 33 [label="Try expression exit"]; - } - 34 [label="Exit block"]; + 18 [label="Enter when branch condition else"]; + 19 [label="Exit when branch condition"]; } - 35 [label="Exit when branch result"]; - 36 [label="Enter when branch result"]; - subgraph cluster_13 { + 20 [label="Enter when branch result"]; + subgraph cluster_8 { color=blue - 37 [label="Enter block"]; - 38 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; - 39 [label="Exit block"]; + 21 [label="Enter block"]; + subgraph cluster_9 { + color=blue + 22 [label="Try expression enter"]; + subgraph cluster_10 { + color=blue + 23 [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"]; + } + 27 [label="Try main block exit"]; + } + subgraph cluster_12 { + color=blue + 28 [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"]; + } + 34 [label="Catch exit"]; + } + 35 [label="Try expression exit"]; + } + 36 [label="Exit block"]; } - 40 [label="Exit when branch result"]; - 41 [label="Enter when branch result"]; + 37 [label="Exit when branch result"]; + 38 [label="Enter when branch result"]; subgraph cluster_14 { color=blue - 42 [label="Enter block"]; - 43 [label="Exit block"]; + 39 [label="Enter block"]; + 40 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; + 41 [label="Exit block"]; } - 44 [label="Exit when branch result"]; - 45 [label="Exit when"]; + 42 [label="Exit when branch result"]; + 43 [label="Enter when branch result"]; + subgraph cluster_15 { + color=blue + 44 [label="Enter block"]; + 45 [label="Exit block"]; + } + 46 [label="Exit when branch result"]; + 47 [label="Exit when"]; } - 46 [label="Jump: ^closeFinally when () { + 48 [label="Jump: ^closeFinally when () { ==(this@R|/closeFinally|, Null(null)) -> { } ==(R|/cause|, Null(null)) -> { @@ -116,127 +124,125 @@ digraph complex_kt { } } "]; - 47 [label="Stub" style="filled" fillcolor=gray]; - 48 [label="Exit function closeFinally" style="filled" fillcolor=red]; + 49 [label="Stub" style="filled" fillcolor=gray]; + 50 [label="Exit function closeFinally" style="filled" fillcolor=red]; } - 4 -> {5}; - 5 -> {6}; 6 -> {7}; 7 -> {8}; 8 -> {9}; 9 -> {10}; - 10 -> {41 11}; + 10 -> {11}; 11 -> {12}; - 12 -> {13}; + 12 -> {43 13}; 13 -> {14}; 14 -> {15}; - 15 -> {36 16}; + 15 -> {16}; 16 -> {17}; - 17 -> {18}; + 17 -> {38 18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {48 26 22}; + 21 -> {22}; 22 -> {23}; - 23 -> {24}; + 23 -> {50 28 24}; 24 -> {25}; - 25 -> {33}; - 26 -> {48 27}; - 27 -> {28}; - 28 -> {29}; + 25 -> {26}; + 26 -> {27}; + 27 -> {35}; + 28 -> {50 29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; 34 -> {35}; - 35 -> {45}; + 35 -> {36}; 36 -> {37}; - 37 -> {38}; + 37 -> {47}; 38 -> {39}; 39 -> {40}; - 40 -> {45}; + 40 -> {41}; 41 -> {42}; - 42 -> {43}; + 42 -> {47}; 43 -> {44}; 44 -> {45}; 45 -> {46}; - 46 -> {48}; - 46 -> {47} [style=dotted]; - 47 -> {48} [style=dotted]; + 46 -> {47}; + 47 -> {48}; + 48 -> {50}; + 48 -> {49} [style=dotted]; + 49 -> {50} [style=dotted]; - subgraph cluster_15 { + subgraph cluster_16 { color=red - 49 [label="Enter function firstIsInstanceOrNull" style="filled" fillcolor=red]; - 50 [label="Access variable this@R|/firstIsInstanceOrNull|"]; - 51 [label="Function call: this@R|/firstIsInstanceOrNull|.R|FakeOverride|>|()"]; - 52 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; - subgraph cluster_16 { + 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|"]; + subgraph cluster_17 { color=blue - 53 [label="Enter while loop"]; - subgraph cluster_17 { - 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"]; - } + 55 [label="Enter while loop"]; subgraph cluster_18 { color=blue - 58 [label="Enter loop block"]; - subgraph cluster_19 { + 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_19 { + color=blue + 60 [label="Enter loop block"]; + subgraph cluster_20 { color=blue - 59 [label="Enter block"]; - 60 [label="Access variable R|/|"]; - 61 [label="Function call: R|/|.R|FakeOverride|()"]; - 62 [label="Variable declaration: lval element: R|kotlin/Any?|"]; - subgraph cluster_20 { + 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?|"]; + subgraph cluster_21 { color=blue - 63 [label="Enter when"]; - subgraph cluster_21 { - color=blue - 64 [label="Enter when branch condition "]; - 65 [label="Access variable R|/element|"]; - 66 [label="Type operator: (R|/element| is R|T|)"]; - 67 [label="Exit when branch condition"]; - } - 68 [label="Synthetic else branch"]; - 69 [label="Enter when branch result"]; + 65 [label="Enter when"]; subgraph cluster_22 { color=blue - 70 [label="Enter block"]; - 71 [label="Access variable R|/element|"]; - 72 [label="Jump: ^firstIsInstanceOrNull R|/element|"]; - 73 [label="Stub" style="filled" fillcolor=gray]; - 74 [label="Exit block" style="filled" fillcolor=gray]; + 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"]; } - 75 [label="Exit when branch result" style="filled" fillcolor=gray]; - 76 [label="Exit when"]; + 70 [label="Synthetic else branch"]; + 71 [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]; + } + 77 [label="Exit when branch result" style="filled" fillcolor=gray]; + 78 [label="Exit when"]; } - 77 [label="Exit block"]; + 79 [label="Exit block"]; } - 78 [label="Exit loop block"]; + 80 [label="Exit loop block"]; } - 79 [label="Exit whileloop"]; + 81 [label="Exit whileloop"]; } - 80 [label="Const: Null(null)"]; - 81 [label="Jump: ^firstIsInstanceOrNull Null(null)"]; - 82 [label="Stub" style="filled" fillcolor=gray]; - 83 [label="Exit function firstIsInstanceOrNull" style="filled" fillcolor=red]; + 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]; } - 49 -> {50}; - 50 -> {51}; 51 -> {52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {79 58}; + 57 -> {58}; 58 -> {59}; - 59 -> {60}; + 59 -> {81 60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; @@ -244,23 +250,25 @@ digraph complex_kt { 64 -> {65}; 65 -> {66}; 66 -> {67}; - 67 -> {69 68}; - 68 -> {76}; - 69 -> {70}; - 70 -> {71}; + 67 -> {68}; + 68 -> {69}; + 69 -> {71 70}; + 70 -> {78}; 71 -> {72}; - 72 -> {83}; - 72 -> {73} [style=dotted]; - 73 -> {74} [style=dotted]; + 72 -> {73}; + 73 -> {74}; + 74 -> {85}; 74 -> {75} [style=dotted]; 75 -> {76} [style=dotted]; - 76 -> {77}; - 77 -> {78}; - 78 -> {54}; + 76 -> {77} [style=dotted]; + 77 -> {78} [style=dotted]; + 78 -> {79}; 79 -> {80}; - 80 -> {81}; - 81 -> {83}; - 81 -> {82} [style=dotted]; - 82 -> {83} [style=dotted]; + 80 -> {56}; + 81 -> {82}; + 82 -> {83}; + 83 -> {85}; + 83 -> {84} [style=dotted]; + 84 -> {85} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot index a209e5db84e..8a26786dc56 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot @@ -34,42 +34,56 @@ digraph initBlock_kt { subgraph cluster_3 { color=red - 9 [label="Enter function " style="filled" fillcolor=red]; - 10 [label="Delegated constructor call: super()"]; - 11 [label="Exit function " style="filled" fillcolor=red]; + 9 [label="Enter class Foo" style="filled" fillcolor=red]; + 10 [label="Exit class Foo" style="filled" fillcolor=red]; } - 9 -> {10}; - 10 -> {11}; subgraph cluster_4 { color=red - 12 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_5 { - color=blue - 13 [label="Enter block"]; - 14 [label="Const: Int(1)"]; - 15 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 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="Const: Int(2)" style="filled" fillcolor=gray]; - 20 [label="Variable declaration: lval y: R|kotlin/Int|" style="filled" fillcolor=gray]; - 21 [label="Exit block" style="filled" fillcolor=gray]; - } - 22 [label="Exit init block" style="filled" fillcolor=red]; + 11 [label="Enter function " style="filled" fillcolor=red]; + 12 [label="Delegated constructor call: super()"]; + 13 [label="Exit function " style="filled" fillcolor=red]; } + 11 -> {12}; 12 -> {13}; - 13 -> {14}; + + subgraph cluster_5 { + color=red + 14 [label="Enter init block" 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]; + } + 24 [label="Exit init block" style="filled" fillcolor=red]; + } + 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {22}; - 17 -> {18} [style=dotted]; - 18 -> {19} [style=dotted]; + 17 -> {18}; + 18 -> {19}; + 19 -> {24}; 19 -> {20} [style=dotted]; 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]; + } + } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot index ef8cf0943a4..33080949fb9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot @@ -5,76 +5,98 @@ digraph initBlockAndInPlaceLambda_kt { subgraph cluster_0 { color=red - 0 [label="Enter function getter" style="filled" fillcolor=red]; - 1 [label="Exit function getter" style="filled" fillcolor=red]; + 0 [label="Enter class B" style="filled" fillcolor=red]; + 1 [label="Exit class B" style="filled" fillcolor=red]; } - 0 -> {1}; + 0 -> {1} [color=green]; subgraph cluster_1 { color=red - 2 [label="Enter property" style="filled" fillcolor=red]; - 3 [label="Exit property" style="filled" fillcolor=red]; + 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 function " style="filled" fillcolor=red]; - 5 [label="Delegated constructor call: super()"]; - 6 [label="Exit function " style="filled" fillcolor=red]; + 4 [label="Enter property" style="filled" fillcolor=red]; + 5 [label="Exit property" style="filled" fillcolor=red]; } 4 -> {5}; - 5 -> {6}; subgraph cluster_3 { color=red - 7 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_4 { - color=blue - 8 [label="Enter block"]; - 9 [label="Access variable R|/a|"]; - 10 [label="Access variable R|/A.b|"]; - 11 [label="Enter safe call"]; - 12 [label="Postponed enter to lambda"]; - subgraph cluster_5 { - color=blue - 13 [label="Enter function anonymousFunction"]; - 14 [label="Access variable R|/a|"]; - 15 [label="Access variable R|/it|"]; - 16 [label="Function call: R|/C.C|(...)"]; - 17 [label="Exit function anonymousFunction"]; - } - 18 [label="Call arguments union" style="filled" fillcolor=yellow]; - 19 [label="Postponed exit from lambda"]; - 20 [label="Function call: R|/a|.R|/A.b|?.R|kotlin/let|(...)"]; - 21 [label="Exit safe call"]; - 22 [label="Variable declaration: lval c: R|C?|"]; - 23 [label="Exit block"]; - } - 24 [label="Exit init block" style="filled" fillcolor=red]; + 6 [label="Enter class A" style="filled" fillcolor=red]; + 7 [label="Exit class A" style="filled" fillcolor=red]; + } + + + 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]; } - 7 -> {8}; 8 -> {9}; 9 -> {10}; - 10 -> {11 21}; + + subgraph cluster_5 { + color=red + 11 [label="Enter init block" 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"]; + 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"]; + } + 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"]; + } + 28 [label="Exit init block" style="filled" fillcolor=red]; + } + 11 -> {12}; 12 -> {13}; - 12 -> {19} [color=red]; 13 -> {14}; - 14 -> {15}; + 14 -> {15 25}; 15 -> {16}; 16 -> {17}; - 17 -> {19} [color=green]; - 17 -> {18} [color=red]; - 18 -> {20} [color=red]; - 19 -> {20} [color=green]; + 16 -> {23} [color=red]; + 17 -> {18}; + 18 -> {19}; + 19 -> {20}; 20 -> {21}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; + 21 -> {23} [color=green]; + 21 -> {22} [color=red]; + 22 -> {24} [color=red]; + 23 -> {24} [color=green]; + 24 -> {25}; + 25 -> {26}; + 26 -> {27}; + 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]; + } + } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot index db91e5134b4..4fe344f108a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot @@ -5,63 +5,87 @@ digraph lambdaReturningObject_kt { subgraph cluster_0 { color=red - 0 [label="Enter function bar" style="filled" fillcolor=red]; - 1 [label="Exit function bar" style="filled" fillcolor=red]; + 0 [label="Enter class Out" style="filled" fillcolor=red]; + 1 [label="Exit class Out" style="filled" fillcolor=red]; } - 0 -> {1}; + 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]; + 2 [label="Enter function bar" style="filled" fillcolor=red]; + 3 [label="Exit function bar" style="filled" fillcolor=red]; } 2 -> {3}; - 3 -> {4}; subgraph cluster_2 { color=red - 5 [label="Enter function MyOut" style="filled" fillcolor=red]; - 6 [label="Function call: R|kotlin/TODO|()"]; - 7 [label="Stub" style="filled" fillcolor=gray]; - 8 [label="Jump: ^MyOut R|kotlin/TODO|()" style="filled" fillcolor=gray]; - 9 [label="Stub" style="filled" fillcolor=gray]; - 10 [label="Exit function MyOut" style="filled" fillcolor=red]; + 4 [label="Enter class IrTypeArgument" style="filled" fillcolor=red]; + 5 [label="Exit class IrTypeArgument" style="filled" fillcolor=red]; } - 5 -> {6}; - 6 -> {10}; - 6 -> {7} [style=dotted]; - 7 -> {8} [style=dotted]; - 8 -> {10 9} [style=dotted]; - 9 -> {10} [style=dotted]; + 4 -> {5} [color=green]; subgraph cluster_3 { color=red - 11 [label="Enter function foo" style="filled" fillcolor=red]; - 12 [label="Postponed enter to lambda"]; - 13 [label="Postponed exit from lambda"]; - 14 [label="Function call: R|/MyOut|(...)"]; - 15 [label="Function call: R|/bar|(...)"]; - 16 [label="Exit function foo" style="filled" fillcolor=red]; + 6 [label="Enter function " style="filled" fillcolor=red]; + 7 [label="Delegated constructor call: super()"]; + 8 [label="Exit function " style="filled" fillcolor=red]; } - 11 -> {12}; - 12 -> {13 13} [color=green]; - 13 -> {14}; - 14 -> {15}; - 15 -> {16}; + 6 -> {7}; + 7 -> {8}; subgraph cluster_4 { color=red - 17 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 18 [label="Access qualifier /IrStarProjectionImpl"]; - 19 [label="Exit function anonymousFunction" style="filled" fillcolor=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]; + } + + 11 -> {12}; + 12 -> {16}; + 12 -> {13} [style=dotted]; + 13 -> {14} [style=dotted]; + 14 -> {16 15} [style=dotted]; + 15 -> {16} [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]; } 17 -> {18}; - 18 -> {19}; + 18 -> {19 19} [color=green]; + 19 -> {20}; + 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}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot index 7d758354194..01973abd175 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot @@ -43,9 +43,10 @@ digraph localClassesWithImplicit_kt { 17 [label="Exit when branch result" style="filled" fillcolor=gray]; 18 [label="Exit when"]; } - 19 [label="Exit anonymous object"]; - 20 [label="Variable declaration: lval x: R|anonymous|"]; - 21 [label="Exit function test" style="filled" fillcolor=red]; + 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]; } 5 -> {6}; @@ -57,7 +58,7 @@ digraph localClassesWithImplicit_kt { 11 -> {18}; 12 -> {13}; 13 -> {14}; - 14 -> {21}; + 14 -> {22}; 14 -> {15} [style=dotted]; 15 -> {16} [style=dotted]; 16 -> {17} [style=dotted]; @@ -65,66 +66,67 @@ digraph localClassesWithImplicit_kt { 18 -> {19}; 19 -> {20}; 20 -> {21}; + 21 -> {22}; subgraph cluster_5 { color=red - 22 [label="Enter function " style="filled" fillcolor=red]; - 23 [label="Delegated constructor call: super()"]; - 24 [label="Exit function " style="filled" fillcolor=red]; + 23 [label="Enter function " style="filled" fillcolor=red]; + 24 [label="Delegated constructor call: super()"]; + 25 [label="Exit function " style="filled" fillcolor=red]; } - 22 -> {23}; 23 -> {24}; + 24 -> {25}; subgraph cluster_6 { color=red - 25 [label="Enter function foo" style="filled" fillcolor=red]; - 26 [label="Postponed enter to lambda"]; + 26 [label="Enter function foo" style="filled" fillcolor=red]; + 27 [label="Postponed enter to lambda"]; subgraph cluster_7 { color=blue - 27 [label="Enter function anonymousFunction"]; - 28 [label="Access variable R|/a|"]; - 29 [label="Access variable R|kotlin/String.length|"]; + 28 [label="Enter function anonymousFunction"]; + 29 [label="Access variable R|/a|"]; + 30 [label="Access variable R|kotlin/String.length|"]; subgraph cluster_8 { color=blue - 30 [label="Enter when"]; + 31 [label="Enter when"]; subgraph cluster_9 { color=blue - 31 [label="Enter when branch condition "]; - 32 [label="Access variable R|/b|"]; - 33 [label="Type operator: (R|/b| is R|kotlin/String|)"]; - 34 [label="Exit when branch condition"]; + 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"]; } subgraph cluster_10 { color=blue - 35 [label="Enter when branch condition else"]; - 36 [label="Exit when branch condition"]; + 36 [label="Enter when branch condition else"]; + 37 [label="Exit when branch condition"]; } - 37 [label="Enter when branch result"]; + 38 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 38 [label="Enter block"]; - 39 [label="Const: Int(1)"]; - 40 [label="Exit block"]; + 39 [label="Enter block"]; + 40 [label="Const: Int(1)"]; + 41 [label="Exit block"]; } - 41 [label="Exit when branch result"]; - 42 [label="Enter when branch result"]; + 42 [label="Exit when branch result"]; + 43 [label="Enter when branch result"]; subgraph cluster_12 { color=blue - 43 [label="Enter block"]; - 44 [label="Access variable R|/b|"]; - 45 [label="Access variable R|kotlin/String.length|"]; - 46 [label="Function call: this@R|/A|.R|/A.bar|()"]; - 47 [label="Exit block"]; + 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"]; } - 48 [label="Exit when branch result"]; - 49 [label="Exit when"]; + 49 [label="Exit when branch result"]; + 50 [label="Exit when"]; } - 50 [label="Exit function anonymousFunction"]; + 51 [label="Exit function anonymousFunction"]; } - 51 [label="Postponed exit from lambda"]; - 52 [label="Function call: R|/myRun|(...)"]; - 53 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 52 [label="Postponed exit from lambda"]; + 53 [label="Function call: R|/myRun|(...)"]; + 54 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| ^ when () { (R|/b| is R|kotlin/String|) -> { @@ -138,29 +140,28 @@ digraph localClassesWithImplicit_kt { } )"]; - 54 [label="Stub" style="filled" fillcolor=gray]; - 55 [label="Exit function foo" style="filled" fillcolor=red]; + 55 [label="Stub" style="filled" fillcolor=gray]; + 56 [label="Exit function foo" style="filled" fillcolor=red]; } - 25 -> {26}; 26 -> {27}; - 26 -> {51} [color=red]; - 27 -> {50 28}; - 28 -> {29}; + 27 -> {28}; + 27 -> {52} [color=red]; + 28 -> {51 29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {42 35}; - 35 -> {36}; + 34 -> {35}; + 35 -> {43 36}; 36 -> {37}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; - 41 -> {49}; - 42 -> {43}; + 41 -> {42}; + 42 -> {50}; 43 -> {44}; 44 -> {45}; 45 -> {46}; @@ -168,132 +169,140 @@ digraph localClassesWithImplicit_kt { 47 -> {48}; 48 -> {49}; 49 -> {50}; - 50 -> {27}; - 50 -> {51} [color=green]; - 51 -> {52}; + 50 -> {51}; + 51 -> {28}; + 51 -> {52} [color=green]; 52 -> {53}; - 53 -> {55}; - 53 -> {54} [style=dotted]; + 53 -> {54}; + 54 -> {56}; 54 -> {55} [style=dotted]; + 55 -> {56} [style=dotted]; subgraph cluster_13 { color=red - 56 [label="Enter function bar" style="filled" fillcolor=red]; - 57 [label="Postponed enter to lambda"]; + 57 [label="Enter function bar" style="filled" fillcolor=red]; + 58 [label="Postponed enter to lambda"]; subgraph cluster_14 { color=blue - 58 [label="Enter function anonymousFunction"]; - 59 [label="Access variable R|/b|"]; - 60 [label="Access variable #"]; - 61 [label="Access variable R|/a|"]; - 62 [label="Access variable R|kotlin/String.length|"]; - 63 [label="Function call: this@R|/A|.R|/A.baz|()"]; - 64 [label="Exit function anonymousFunction"]; + 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"]; } - 65 [label="Postponed exit from lambda"]; - 66 [label="Function call: R|/myRun|(...)"]; - 67 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 66 [label="Postponed exit from lambda"]; + 67 [label="Function call: R|/myRun|(...)"]; + 68 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/b|.# R|/a|.R|kotlin/String.length| ^ this@R|/A|.R|/A.baz|() } )"]; - 68 [label="Stub" style="filled" fillcolor=gray]; - 69 [label="Exit function bar" style="filled" fillcolor=red]; + 69 [label="Stub" style="filled" fillcolor=gray]; + 70 [label="Exit function bar" style="filled" fillcolor=red]; } - 56 -> {57}; 57 -> {58}; - 57 -> {65} [color=red]; - 58 -> {64 59}; - 59 -> {60}; + 58 -> {59}; + 58 -> {66} [color=red]; + 59 -> {65 60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {58}; - 64 -> {65} [color=green]; - 65 -> {66}; + 64 -> {65}; + 65 -> {59}; + 65 -> {66} [color=green]; 66 -> {67}; - 67 -> {69}; - 67 -> {68} [style=dotted]; + 67 -> {68}; + 68 -> {70}; 68 -> {69} [style=dotted]; + 69 -> {70} [style=dotted]; subgraph cluster_15 { color=red - 70 [label="Enter function baz" style="filled" fillcolor=red]; - 71 [label="Const: Int(1)"]; - 72 [label="Jump: ^baz Int(1)"]; - 73 [label="Stub" style="filled" fillcolor=gray]; - 74 [label="Exit function baz" style="filled" fillcolor=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]; } - 70 -> {71}; 71 -> {72}; - 72 -> {74}; - 72 -> {73} [style=dotted]; + 72 -> {73}; + 73 -> {75}; 73 -> {74} [style=dotted]; + 74 -> {75} [style=dotted]; subgraph cluster_16 { color=red - 75 [label="Enter function " style="filled" fillcolor=red]; - 76 [label="Delegated constructor call: super()"]; - 77 [label="Exit function " style="filled" fillcolor=red]; + 76 [label="Enter class A" style="filled" fillcolor=red]; + 77 [label="Exit class A" style="filled" fillcolor=red]; } - 75 -> {76}; - 76 -> {77}; + 76 -> {77} [color=green]; subgraph cluster_17 { color=red - 78 [label="Enter function foo" style="filled" fillcolor=red]; - 79 [label="Postponed enter to lambda"]; - subgraph cluster_18 { + 78 [label="Enter function " style="filled" fillcolor=red]; + 79 [label="Delegated constructor call: super()"]; + 80 [label="Exit function " style="filled" fillcolor=red]; + } + + 78 -> {79}; + 79 -> {80}; + + subgraph cluster_18 { + color=red + 81 [label="Enter function foo" style="filled" fillcolor=red]; + 82 [label="Postponed enter to lambda"]; + subgraph cluster_19 { color=blue - 80 [label="Enter function anonymousFunction"]; - 81 [label="Access variable R|/a|"]; - 82 [label="Access variable R|kotlin/String.length|"]; - subgraph cluster_19 { + 83 [label="Enter function anonymousFunction"]; + 84 [label="Access variable R|/a|"]; + 85 [label="Access variable R|kotlin/String.length|"]; + subgraph cluster_20 { color=blue - 83 [label="Enter when"]; - subgraph cluster_20 { - color=blue - 84 [label="Enter when branch condition "]; - 85 [label="Access variable R|/b|"]; - 86 [label="Type operator: (R|/b| is R|kotlin/String|)"]; - 87 [label="Exit when branch condition"]; - } + 86 [label="Enter when"]; subgraph cluster_21 { color=blue - 88 [label="Enter when branch condition else"]; - 89 [label="Exit when branch condition"]; + 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"]; } - 90 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 91 [label="Enter block"]; - 92 [label="Const: Int(1)"]; - 93 [label="Exit block"]; + 91 [label="Enter when branch condition else"]; + 92 [label="Exit when branch condition"]; } - 94 [label="Exit when branch result"]; - 95 [label="Enter when branch result"]; + 93 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 96 [label="Enter block"]; - 97 [label="Access variable R|/b|"]; - 98 [label="Access variable R|kotlin/String.length|"]; - 99 [label="Exit anonymous object"]; - 100 [label="Function call: this@R|/anonymous|.R|/anonymous.bar|()"]; - 101 [label="Exit block"]; + 94 [label="Enter block"]; + 95 [label="Const: Int(1)"]; + 96 [label="Exit block"]; } - 102 [label="Exit when branch result"]; - 103 [label="Exit when"]; + 97 [label="Exit when branch result"]; + 98 [label="Enter when branch result"]; + subgraph cluster_24 { + color=blue + 99 [label="Enter block"]; + 100 [label="Access variable R|/b|"]; + 101 [label="Access variable R|kotlin/String.length|"]; + 102 [label="Function call: this@R|/anonymous|.R|/anonymous.bar|()"]; + 103 [label="Exit block"]; + } + 104 [label="Exit when branch result"]; + 105 [label="Exit when"]; } - 104 [label="Exit function anonymousFunction"]; + 106 [label="Exit function anonymousFunction"]; } - 105 [label="Postponed exit from lambda"]; - 106 [label="Function call: R|/myRun|(...)"]; - 107 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 107 [label="Postponed exit from lambda"]; + 108 [label="Function call: R|/myRun|(...)"]; + 109 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| ^ when () { (R|/b| is R|kotlin/String|) -> { @@ -307,103 +316,108 @@ digraph localClassesWithImplicit_kt { } )"]; - 108 [label="Stub" style="filled" fillcolor=gray]; - 109 [label="Exit function foo" style="filled" fillcolor=red]; + 110 [label="Stub" style="filled" fillcolor=gray]; + 111 [label="Exit function foo" style="filled" fillcolor=red]; } - 78 -> {79}; - 79 -> {80}; - 79 -> {105} [color=red]; - 80 -> {104 81}; 81 -> {82}; 82 -> {83}; - 83 -> {84}; + 82 -> {107} [color=red]; + 83 -> {106 84}; 84 -> {85}; 85 -> {86}; 86 -> {87}; - 87 -> {95 88}; + 87 -> {88}; 88 -> {89}; 89 -> {90}; - 90 -> {91}; + 90 -> {98 91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; - 94 -> {103}; + 94 -> {95}; 95 -> {96}; 96 -> {97}; - 97 -> {98}; + 97 -> {105}; 98 -> {99}; 99 -> {100}; 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; - 104 -> {80}; - 104 -> {105} [color=green]; + 104 -> {105}; 105 -> {106}; - 106 -> {107}; - 107 -> {109}; - 107 -> {108} [style=dotted]; - 108 -> {109} [style=dotted]; + 106 -> {83}; + 106 -> {107} [color=green]; + 107 -> {108}; + 108 -> {109}; + 109 -> {111}; + 109 -> {110} [style=dotted]; + 110 -> {111} [style=dotted]; - subgraph cluster_24 { + subgraph cluster_25 { color=red - 110 [label="Enter function bar" style="filled" fillcolor=red]; - 111 [label="Postponed enter to lambda"]; - subgraph cluster_25 { + 112 [label="Enter function bar" style="filled" fillcolor=red]; + 113 [label="Postponed enter to lambda"]; + subgraph cluster_26 { color=blue - 112 [label="Enter function anonymousFunction"]; - 113 [label="Access variable R|/a|"]; - 114 [label="Access variable R|kotlin/String.length|"]; - 115 [label="Access variable R|/b|"]; - 116 [label="Access variable #"]; - 117 [label="Exit anonymous object"]; - 118 [label="Function call: this@R|/anonymous|.R|/anonymous.baz|()"]; - 119 [label="Exit function anonymousFunction"]; + 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"]; } - 120 [label="Postponed exit from lambda"]; - 121 [label="Function call: R|/myRun|(...)"]; - 122 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 121 [label="Postponed exit from lambda"]; + 122 [label="Function call: R|/myRun|(...)"]; + 123 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| R|/b|.# ^ this@R|/anonymous|.R|/anonymous.baz|() } )"]; - 123 [label="Stub" style="filled" fillcolor=gray]; - 124 [label="Exit function bar" style="filled" fillcolor=red]; + 124 [label="Stub" style="filled" fillcolor=gray]; + 125 [label="Exit function bar" style="filled" fillcolor=red]; } - 110 -> {111}; - 111 -> {112}; - 111 -> {120} [color=red]; - 112 -> {119 113}; + 112 -> {113}; 113 -> {114}; - 114 -> {115}; + 113 -> {121} [color=red]; + 114 -> {120 115}; 115 -> {116}; 116 -> {117}; 117 -> {118}; 118 -> {119}; - 119 -> {112}; - 119 -> {120} [color=green]; - 120 -> {121}; + 119 -> {120}; + 120 -> {114}; + 120 -> {121} [color=green]; 121 -> {122}; - 122 -> {124}; - 122 -> {123} [style=dotted]; + 122 -> {123}; + 123 -> {125}; 123 -> {124} [style=dotted]; + 124 -> {125} [style=dotted]; - subgraph cluster_26 { + subgraph cluster_27 { color=red - 125 [label="Enter function baz" style="filled" fillcolor=red]; - 126 [label="Const: Int(1)"]; - 127 [label="Jump: ^baz Int(1)"]; - 128 [label="Stub" style="filled" fillcolor=gray]; - 129 [label="Exit function baz" style="filled" fillcolor=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]; } - 125 -> {126}; 126 -> {127}; - 127 -> {129}; - 127 -> {128} [style=dotted]; + 127 -> {128}; + 128 -> {130}; 128 -> {129} [style=dotted]; + 129 -> {130} [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/postponedLambdaInConstructor.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot index 351cbc05efe..a75702dbf75 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot @@ -15,73 +15,88 @@ digraph postponedLambdaInConstructor_kt { subgraph cluster_1 { color=red - 3 [label="Enter function " style="filled" fillcolor=red]; - 4 [label="Access variable R|/s|"]; - 5 [label="Postponed enter to lambda"]; - subgraph cluster_2 { - color=blue - 6 [label="Enter function anonymousFunction"]; - 7 [label="Postponed enter to lambda"]; - 8 [label="Postponed exit from lambda"]; - 9 [label="Exit function anonymousFunction"]; - } - 10 [label="Postponed exit from lambda"]; - 11 [label="Function call: R|/s|.R|kotlin/let| kotlin/String|>(...)"]; - 12 [label="Call arguments union" style="filled" fillcolor=yellow]; - 13 [label="Delegated constructor call: super(...)"]; - 14 [label="Exit function " style="filled" fillcolor=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"]; + subgraph cluster_3 { + color=blue + 8 [label="Enter function anonymousFunction"]; + 9 [label="Postponed enter to lambda"]; + 10 [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]; + 15 [label="Delegated constructor call: super(...)"]; + 16 [label="Exit function " style="filled" fillcolor=red]; } - 3 -> {4}; - 4 -> {5}; 5 -> {6}; - 5 -> {10} [color=red]; 6 -> {7}; - 7 -> {8 8} [color=green]; + 7 -> {8}; + 7 -> {12} [color=red]; 8 -> {9}; - 9 -> {10} [color=green]; - 9 -> {12} [color=red]; + 9 -> {10 10} [color=green]; 10 -> {11}; - 11 -> {12}; + 11 -> {12} [color=green]; + 11 -> {14} [color=red]; 12 -> {13}; 13 -> {14}; - - subgraph cluster_3 { - color=red - 15 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 16 [label="Access variable R|/it|"]; - 17 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - + 14 -> {15}; 15 -> {16}; - 16 -> {17}; subgraph cluster_4 { color=red - 18 [label="Enter function getter" style="filled" fillcolor=red]; - 19 [label="Exit function getter" style="filled" fillcolor=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}; subgraph cluster_5 { color=red - 20 [label="Enter property" style="filled" fillcolor=red]; - 21 [label="Access variable R|/s|"]; - 22 [label="Exit property" style="filled" fillcolor=red]; + 20 [label="Enter function getter" style="filled" fillcolor=red]; + 21 [label="Exit function getter" style="filled" fillcolor=red]; } 20 -> {21}; - 21 -> {22}; subgraph cluster_6 { color=red - 23 [label="Enter function foo" style="filled" fillcolor=red]; - 24 [label="Function call: this@R|/B|.R|/B.foo|()"]; - 25 [label="Exit function foo" style="filled" fillcolor=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}; - 24 -> {25}; + + 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]; + } + + 25 -> {26}; + 26 -> {27}; + + subgraph cluster_8 { + color=red + 28 [label="Enter class B" style="filled" fillcolor=red]; + 29 [label="Exit class B" style="filled" fillcolor=red]; + } + } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot index c7e616d6896..00f95891f71 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot @@ -127,143 +127,157 @@ digraph propertiesAndInitBlocks_kt { subgraph cluster_10 { color=red - 40 [label="Enter function getter" style="filled" fillcolor=red]; - 41 [label="Exit function getter" style="filled" fillcolor=red]; + 40 [label="Enter class LocalClass" style="filled" fillcolor=red]; + 41 [label="Exit class LocalClass" style="filled" fillcolor=red]; } - 40 -> {41}; subgraph cluster_11 { color=red - 42 [label="Enter function " style="filled" fillcolor=red]; - 43 [label="Delegated constructor call: super()"]; - 44 [label="Exit function " style="filled" fillcolor=red]; + 42 [label="Enter function getter" style="filled" fillcolor=red]; + 43 [label="Exit function getter" style="filled" fillcolor=red]; } 42 -> {43}; - 43 -> {44}; subgraph cluster_12 { color=red - 45 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_13 { - color=blue - 46 [label="Enter block"]; - 47 [label="Function call: R|java/lang/Exception.Exception|()"]; - 48 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 49 [label="Stub" style="filled" fillcolor=gray]; - 50 [label="Exit block" style="filled" fillcolor=gray]; - } - 51 [label="Exit init block" style="filled" fillcolor=red]; + 44 [label="Enter function " style="filled" fillcolor=red]; + 45 [label="Delegated constructor call: super()"]; + 46 [label="Exit function " style="filled" fillcolor=red]; } + 44 -> {45}; 45 -> {46}; - 46 -> {47}; - 47 -> {48}; - 48 -> {51}; - 48 -> {49} [style=dotted]; - 49 -> {50} [style=dotted]; - 50 -> {51} [style=dotted]; - subgraph cluster_14 { + subgraph cluster_13 { color=red - 52 [label="Enter property" style="filled" fillcolor=red]; - 53 [label="Postponed enter to lambda"]; - subgraph cluster_15 { + 47 [label="Enter init block" style="filled" fillcolor=red]; + subgraph cluster_14 { color=blue - 54 [label="Enter function anonymousFunction"]; - 55 [label="Function call: R|java/lang/Exception.Exception|()"]; - 56 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 57 [label="Stub" style="filled" fillcolor=gray]; - 58 [label="Exit function anonymousFunction"]; + 48 [label="Enter block"]; + 49 [label="Function call: R|java/lang/Exception.Exception|()"]; + 50 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 51 [label="Stub" style="filled" fillcolor=gray]; + 52 [label="Exit block" style="filled" fillcolor=gray]; } - 59 [label="Postponed exit from lambda"]; - 60 [label="Function call: R|/run|(...)"]; - 61 [label="Exit property" style="filled" fillcolor=red]; + 53 [label="Exit init block" style="filled" fillcolor=red]; + } + + 47 -> {48}; + 48 -> {49}; + 49 -> {50}; + 50 -> {53}; + 50 -> {51} [style=dotted]; + 51 -> {52} [style=dotted]; + 52 -> {53} [style=dotted]; + + subgraph cluster_15 { + color=red + 54 [label="Enter class LocalClass" style="filled" fillcolor=red]; + 55 [label="Exit class LocalClass" style="filled" fillcolor=red]; } - 52 -> {53}; - 53 -> {54}; - 53 -> {59} [color=red]; - 54 -> {58 55}; - 55 -> {56}; - 56 -> {61}; - 56 -> {57} [style=dotted]; - 57 -> {58} [style=dotted]; - 58 -> {54}; - 58 -> {59} [color=green]; - 59 -> {60}; - 60 -> {61}; subgraph cluster_16 { color=red - 62 [label="Enter function getter" style="filled" fillcolor=red]; - 63 [label="Exit function getter" style="filled" fillcolor=red]; + 56 [label="Enter property" style="filled" fillcolor=red]; + 57 [label="Postponed enter to lambda"]; + subgraph cluster_17 { + color=blue + 58 [label="Enter function anonymousFunction"]; + 59 [label="Function call: R|java/lang/Exception.Exception|()"]; + 60 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 61 [label="Stub" style="filled" fillcolor=gray]; + 62 [label="Exit function anonymousFunction"]; + } + 63 [label="Postponed exit from lambda"]; + 64 [label="Function call: R|/run|(...)"]; + 65 [label="Exit property" style="filled" fillcolor=red]; } - 62 -> {63}; + 56 -> {57}; + 57 -> {58}; + 57 -> {63} [color=red]; + 58 -> {62 59}; + 59 -> {60}; + 60 -> {65}; + 60 -> {61} [style=dotted]; + 61 -> {62} [style=dotted]; + 62 -> {58}; + 62 -> {63} [color=green]; + 63 -> {64}; + 64 -> {65}; - subgraph cluster_17 { + subgraph cluster_18 { color=red - 64 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_18 { + 66 [label="Enter function getter" style="filled" fillcolor=red]; + 67 [label="Exit function getter" style="filled" fillcolor=red]; + } + + 66 -> {67}; + + subgraph cluster_19 { + color=red + 68 [label="Enter property" style="filled" fillcolor=red]; + subgraph cluster_20 { color=blue - 65 [label="Try expression enter"]; - subgraph cluster_19 { - color=blue - 66 [label="Try main block enter"]; - subgraph cluster_20 { - color=blue - 67 [label="Enter block"]; - 68 [label="Const: Int(1)"]; - 69 [label="Exit block"]; - } - 70 [label="Try main block exit"]; - } + 69 [label="Try expression enter"]; subgraph cluster_21 { color=blue - 71 [label="Enter finally"]; + 70 [label="Try main block enter"]; subgraph cluster_22 { color=blue - 72 [label="Enter block"]; - 73 [label="Const: Int(0)"]; - 74 [label="Exit block"]; + 71 [label="Enter block"]; + 72 [label="Const: Int(1)"]; + 73 [label="Exit block"]; } - 75 [label="Exit finally"]; + 74 [label="Try main block exit"]; } subgraph cluster_23 { color=blue - 76 [label="Catch enter"]; + 75 [label="Enter finally"]; subgraph cluster_24 { color=blue - 77 [label="Enter block"]; - 78 [label="Const: Int(2)"]; - 79 [label="Exit block"]; + 76 [label="Enter block"]; + 77 [label="Const: Int(0)"]; + 78 [label="Exit block"]; } - 80 [label="Catch exit"]; + 79 [label="Exit finally"]; } - 81 [label="Try expression exit"]; + subgraph cluster_25 { + color=blue + 80 [label="Catch enter"]; + subgraph cluster_26 { + color=blue + 81 [label="Enter block"]; + 82 [label="Const: Int(2)"]; + 83 [label="Exit block"]; + } + 84 [label="Catch exit"]; + } + 85 [label="Try expression exit"]; } - 82 [label="Exit property" style="filled" fillcolor=red]; + 86 [label="Exit property" style="filled" fillcolor=red]; } - 64 -> {65}; - 65 -> {66}; - 66 -> {82 76 71 67}; - 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {81}; + 70 -> {86 80 75 71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; - 74 -> {75}; - 75 -> {81}; - 76 -> {82 77}; + 74 -> {85}; + 75 -> {76}; + 76 -> {77}; 77 -> {78}; 78 -> {79}; - 79 -> {80}; - 80 -> {81}; + 79 -> {85}; + 80 -> {86 81}; 81 -> {82}; + 82 -> {83}; + 83 -> {84}; + 84 -> {85}; + 85 -> {86}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot index 35df5a3872d..4617a446d2e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot @@ -5,155 +5,179 @@ digraph returnValuesFromLambda_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]; + 0 [label="Enter class A" style="filled" fillcolor=red]; + 1 [label="Exit class A" style="filled" fillcolor=red]; } - 0 -> {1}; - 1 -> {2}; + 0 -> {1} [color=green]; subgraph cluster_1 { color=red - 3 [label="Enter function " style="filled" fillcolor=red]; - 4 [label="Delegated constructor call: super()"]; - 5 [label="Exit function " style="filled" fillcolor=red]; + 2 [label="Enter function " style="filled" fillcolor=red]; + 3 [label="Delegated constructor call: super()"]; + 4 [label="Exit function " style="filled" fillcolor=red]; } + 2 -> {3}; 3 -> {4}; - 4 -> {5}; subgraph cluster_2 { color=red - 6 [label="Enter function test_1" style="filled" fillcolor=red]; - 7 [label="Postponed enter to lambda"]; - subgraph cluster_3 { - color=blue - 8 [label="Enter function anonymousFunction"]; - subgraph cluster_4 { - color=blue - 9 [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"]; - } - 13 [label="Synthetic else branch"]; - 14 [label="Enter when branch result"]; - subgraph cluster_6 { - color=blue - 15 [label="Enter block"]; - 16 [label="Function call: R|/B.B|()"]; - 17 [label="Jump: ^@run R|/B.B|()"]; - 18 [label="Stub" style="filled" fillcolor=gray]; - 19 [label="Exit block" style="filled" fillcolor=gray]; - } - 20 [label="Exit when branch result" style="filled" fillcolor=gray]; - 21 [label="Exit when"]; - } - 22 [label="Function call: R|/C.C|()"]; - 23 [label="Exit function anonymousFunction"]; - } - 24 [label="Call arguments union" style="filled" fillcolor=yellow]; - 25 [label="Postponed exit from lambda"]; - 26 [label="Function call: R|kotlin/run|(...)"]; - 27 [label="Variable declaration: lval x: R|A|"]; - 28 [label="Exit function test_1" style="filled" fillcolor=red]; + 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]; } - 6 -> {7}; 7 -> {8}; - 7 -> {25} [color=red]; 8 -> {9}; - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {14 13}; - 13 -> {21}; + + 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"]; + subgraph cluster_6 { + color=blue + 14 [label="Enter function anonymousFunction"]; + subgraph cluster_7 { + color=blue + 15 [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"]; + } + 19 [label="Synthetic else branch"]; + 20 [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]; + } + 26 [label="Exit when branch result" style="filled" fillcolor=gray]; + 27 [label="Exit when"]; + } + 28 [label="Function call: R|/C.C|()"]; + 29 [label="Exit function anonymousFunction"]; + } + 30 [label="Call arguments union" style="filled" fillcolor=yellow]; + 31 [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]; + } + + 12 -> {13}; + 13 -> {14}; + 13 -> {31} [color=red]; 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {23}; - 17 -> {18} [style=dotted]; - 18 -> {19} [style=dotted]; - 19 -> {20} [style=dotted]; - 20 -> {21} [style=dotted]; + 17 -> {18}; + 18 -> {20 19}; + 19 -> {27}; + 20 -> {21}; 21 -> {22}; 22 -> {23}; - 23 -> {25} [color=green]; - 23 -> {24} [color=red]; - 24 -> {26} [color=red]; - 25 -> {26} [color=green]; - 26 -> {27}; + 23 -> {29}; + 23 -> {24} [style=dotted]; + 24 -> {25} [style=dotted]; + 25 -> {26} [style=dotted]; + 26 -> {27} [style=dotted]; 27 -> {28}; - - subgraph cluster_7 { - color=red - 29 [label="Enter function test_2" style="filled" fillcolor=red]; - 30 [label="Postponed enter to lambda"]; - subgraph cluster_8 { - color=blue - 31 [label="Enter function anonymousFunction"]; - 32 [label="Function call: R|/C.C|()"]; - 33 [label="Jump: ^@run R|/C.C|()"]; - 34 [label="Stub" style="filled" fillcolor=gray]; - 35 [label="Exit function anonymousFunction"]; - } - 36 [label="Call arguments union" style="filled" fillcolor=yellow]; - 37 [label="Postponed exit from lambda"]; - 38 [label="Function call: R|kotlin/run|(...)"]; - 39 [label="Variable declaration: lval x: R|C|"]; - 40 [label="Exit function test_2" style="filled" fillcolor=red]; - } - - 29 -> {30}; - 30 -> {31}; - 30 -> {37} [color=red]; - 31 -> {32}; + 28 -> {29}; + 29 -> {31} [color=green]; + 29 -> {30} [color=red]; + 30 -> {32} [color=red]; + 31 -> {32} [color=green]; 32 -> {33}; - 33 -> {35}; - 33 -> {34} [style=dotted]; - 34 -> {35} [style=dotted]; - 35 -> {37} [color=green]; - 35 -> {36} [color=red]; - 36 -> {38} [color=red]; - 37 -> {38} [color=green]; - 38 -> {39}; - 39 -> {40}; + 33 -> {34}; - subgraph cluster_9 { + subgraph cluster_10 { color=red - 41 [label="Enter function test_3" style="filled" fillcolor=red]; - 42 [label="Postponed enter to lambda"]; - subgraph cluster_10 { + 35 [label="Enter function test_2" style="filled" fillcolor=red]; + 36 [label="Postponed enter to lambda"]; + subgraph cluster_11 { color=blue - 43 [label="Enter function anonymousFunction"]; - 44 [label="Jump: ^test_3 Unit"]; - 45 [label="Stub" style="filled" fillcolor=gray]; - 46 [label="Exit function anonymousFunction" style="filled" fillcolor=gray]; + 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"]; } - 47 [label="Call arguments union" style="filled" fillcolor=gray]; - 48 [label="Postponed exit from lambda"]; - 49 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=gray]; - 50 [label="Stub" style="filled" fillcolor=gray]; - 51 [label="Variable declaration: lval x: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 52 [label="Exit function test_3" style="filled" fillcolor=red]; + 42 [label="Call arguments union" style="filled" fillcolor=yellow]; + 43 [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]; } - 41 -> {42}; - 42 -> {43}; - 42 -> {48} [color=red]; - 43 -> {44}; - 44 -> {52}; - 44 -> {45} [style=dotted]; - 45 -> {46} [style=dotted]; - 46 -> {47} [style=dotted]; - 46 -> {48} [color=green]; - 47 -> {49} [style=dotted]; - 48 -> {49} [color=green]; - 49 -> {52 50} [style=dotted]; + 35 -> {36}; + 36 -> {37}; + 36 -> {43} [color=red]; + 37 -> {38}; + 38 -> {39}; + 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}; + + subgraph cluster_12 { + color=red + 47 [label="Enter function test_3" style="filled" fillcolor=red]; + 48 [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]; + 52 [label="Exit function anonymousFunction" style="filled" fillcolor=gray]; + } + 53 [label="Call arguments union" style="filled" fillcolor=gray]; + 54 [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]; + } + + 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]; + 57 -> {58} [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 24d7f05a704..44eaad6b3f4 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot @@ -21,78 +21,93 @@ digraph safeCalls_kt { subgraph cluster_2 { color=red - 4 [label="Enter function getter" style="filled" fillcolor=red]; - 5 [label="Exit function getter" style="filled" fillcolor=red]; + 4 [label="Enter class A" style="filled" fillcolor=red]; + 5 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5}; + 4 -> {5} [color=green]; subgraph cluster_3 { color=red - 6 [label="Enter property" style="filled" fillcolor=red]; - 7 [label="Exit property" style="filled" fillcolor=red]; + 6 [label="Enter function getter" style="filled" fillcolor=red]; + 7 [label="Exit function getter" style="filled" fillcolor=red]; } 6 -> {7}; subgraph cluster_4 { color=red - 8 [label="Enter function getter" style="filled" fillcolor=red]; - 9 [label="Exit function getter" style="filled" fillcolor=red]; + 8 [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 property" style="filled" fillcolor=red]; - 11 [label="Exit property" style="filled" fillcolor=red]; + 10 [label="Enter function getter" style="filled" fillcolor=red]; + 11 [label="Exit function getter" style="filled" fillcolor=red]; } 10 -> {11}; subgraph cluster_6 { color=red - 12 [label="Enter function test_1" style="filled" fillcolor=red]; - 13 [label="Access variable R|/x|"]; - 14 [label="Enter safe call"]; - 15 [label="Function call: R|/x|?.R|/A.foo|()"]; - 16 [label="Exit safe call"]; - 17 [label="Enter safe call"]; - 18 [label="Function call: R|/x|?.R|/A.foo|()?.R|/A.bar|()"]; - 19 [label="Exit safe call"]; - 20 [label="Exit function test_1" style="filled" fillcolor=red]; + 12 [label="Enter property" style="filled" fillcolor=red]; + 13 [label="Exit property" style="filled" fillcolor=red]; } 12 -> {13}; - 13 -> {14 16}; - 14 -> {15}; - 15 -> {16}; - 16 -> {17 19}; - 17 -> {18}; - 18 -> {19}; - 19 -> {20}; subgraph cluster_7 { color=red - 21 [label="Enter function test_2" style="filled" fillcolor=red]; - 22 [label="Access variable R|/x|"]; - 23 [label="Enter safe call"]; - 24 [label="Access variable R|/B.foo|"]; - 25 [label="Exit safe call"]; - 26 [label="Enter safe call"]; - 27 [label="Access variable R|/B.bar|"]; - 28 [label="Exit safe call"]; - 29 [label="Exit function test_2" style="filled" fillcolor=red]; + 14 [label="Enter class B" style="filled" fillcolor=red]; + 15 [label="Exit class B" style="filled" fillcolor=red]; } + + 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|()"]; + 20 [label="Exit safe call"]; + 21 [label="Enter safe call"]; + 22 [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]; + } + + 16 -> {17}; + 17 -> {18 20}; + 18 -> {19}; + 19 -> {20}; + 20 -> {21 23}; 21 -> {22}; - 22 -> {23 25}; + 22 -> {23}; 23 -> {24}; - 24 -> {25}; - 25 -> {26 28}; - 26 -> {27}; + + 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|"]; + 29 [label="Exit safe call"]; + 30 [label="Enter safe call"]; + 31 [label="Access variable R|/B.bar|"]; + 32 [label="Exit safe call"]; + 33 [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}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot index d7a020084c5..14ad2edeb5c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot @@ -131,60 +131,76 @@ digraph when_kt { subgraph cluster_10 { color=red - 47 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_11 { - color=blue - 48 [label="Enter when"]; - subgraph cluster_12 { - color=blue - 49 [label="Enter when branch condition "]; - subgraph cluster_13 { - color=blue - 50 [label="Enter &&"]; - 51 [label="Access variable R|/x|"]; - 52 [label="Type operator: (R|/x| is R|A|)"]; - 53 [label="Exit left part of &&"]; - 54 [label="Enter right part of &&"]; - 55 [label="Access variable R|/x|"]; - 56 [label="Type operator: (R|/x| is R|B|)"]; - 57 [label="Exit &&"]; - } - 58 [label="Exit when branch condition"]; - } - 59 [label="Synthetic else branch"]; - 60 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 61 [label="Enter block"]; - 62 [label="Access variable R|/x|"]; - 63 [label="Type operator: (R|/x| is R|A|)"]; - 64 [label="Exit block"]; - } - 65 [label="Exit when branch result"]; - 66 [label="Exit when"]; - } - 67 [label="Exit function test_2" style="filled" fillcolor=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 { + color=red + 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 { + color=red + 51 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_13 { + color=blue + 52 [label="Enter when"]; + subgraph cluster_14 { + color=blue + 53 [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 &&"]; + } + 62 [label="Exit when branch condition"]; + } + 63 [label="Synthetic else branch"]; + 64 [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"]; + } + 69 [label="Exit when branch result"]; + 70 [label="Exit when"]; + } + 71 [label="Exit function test_2" style="filled" fillcolor=red]; } - 47 -> {48}; - 48 -> {49}; - 49 -> {50}; - 50 -> {51}; 51 -> {52}; 52 -> {53}; - 53 -> {57 54}; + 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {58}; - 58 -> {60 59}; - 59 -> {66}; + 57 -> {61 58}; + 58 -> {59}; + 59 -> {60}; 60 -> {61}; 61 -> {62}; - 62 -> {63}; - 63 -> {64}; + 62 -> {64 63}; + 63 -> {70}; 64 -> {65}; 65 -> {66}; 66 -> {67}; + 67 -> {68}; + 68 -> {69}; + 69 -> {70}; + 70 -> {71}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot b/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot index 732e6efea4c..2e5183f1012 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot @@ -31,77 +31,89 @@ digraph exhaustiveWhenAndDNNType_kt { 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]; + 7 [label="Enter class SomeEnum" style="filled" fillcolor=red]; + 8 [label="Exit class SomeEnum" style="filled" fillcolor=red]; } - 7 -> {8}; - 8 -> {9}; + 7 -> {8} [color=green]; subgraph cluster_4 { color=red - 10 [label="Enter function takeB" style="filled" fillcolor=red]; - 11 [label="Exit function takeB" style="filled" fillcolor=red]; + 9 [label="Enter function " style="filled" fillcolor=red]; + 10 [label="Delegated constructor call: super()"]; + 11 [label="Exit function " style="filled" fillcolor=red]; } + 9 -> {10}; 10 -> {11}; subgraph cluster_5 { color=red - 12 [label="Enter function test_1" style="filled" fillcolor=red]; - 13 [label="Access qualifier /SomeEnum"]; - 14 [label="Access variable R|/SomeEnum.A1|"]; - 15 [label="Variable declaration: lval flag: R|SomeEnum|"]; - subgraph cluster_6 { - color=blue - 16 [label="Enter when"]; - 17 [label="Access variable R|/flag|"]; - 18 [label="Check not null: R|/flag|!!"]; - subgraph cluster_7 { - color=blue - 19 [label="Enter when branch condition "]; - 20 [label="Access qualifier /SomeEnum"]; - 21 [label="Access variable R|/SomeEnum.A1|"]; - 22 [label="Operator =="]; - 23 [label="Exit when branch condition"]; - } - subgraph cluster_8 { - color=blue - 24 [label="Enter when branch condition "]; - 25 [label="Access qualifier /SomeEnum"]; - 26 [label="Access variable R|/SomeEnum.A2|"]; - 27 [label="Operator =="]; - 28 [label="Exit when branch condition"]; - } - 29 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 30 [label="Enter block"]; - 31 [label="Function call: R|/B.B|()"]; - 32 [label="Exit block"]; - } - 33 [label="Exit when branch result"]; - 34 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 35 [label="Enter block"]; - 36 [label="Function call: R|/B.B|()"]; - 37 [label="Exit block"]; - } - 38 [label="Exit when branch result"]; - 39 [label="Exit when"]; - } - 40 [label="Variable declaration: lval b: R|B|"]; - 41 [label="Access variable R|/b|"]; - 42 [label="Function call: R|/takeB|(...)"]; - 43 [label="Exit function test_1" style="filled" fillcolor=red]; + 12 [label="Enter class B" style="filled" fillcolor=red]; + 13 [label="Exit class B" style="filled" fillcolor=red]; + } + + 12 -> {13} [color=green]; + + subgraph cluster_6 { + color=red + 14 [label="Enter function takeB" style="filled" fillcolor=red]; + 15 [label="Exit function takeB" style="filled" fillcolor=red]; } - 12 -> {13}; - 13 -> {14}; 14 -> {15}; - 15 -> {16}; + + 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|"]; + subgraph cluster_8 { + color=blue + 20 [label="Enter when"]; + 21 [label="Access variable R|/flag|"]; + 22 [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"]; + } + 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"]; + } + 33 [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"]; + } + 37 [label="Exit when branch result"]; + 38 [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"]; + } + 42 [label="Exit when branch result"]; + 43 [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]; + } + 16 -> {17}; 17 -> {18}; 18 -> {19}; @@ -109,82 +121,82 @@ digraph exhaustiveWhenAndDNNType_kt { 20 -> {21}; 21 -> {22}; 22 -> {23}; - 23 -> {34 24}; + 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {28}; + 27 -> {38 28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; - 33 -> {39}; + 33 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {38}; + 37 -> {43}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; - - subgraph cluster_11 { - color=red - 44 [label="Enter function test_2" style="filled" fillcolor=red]; - 45 [label="Access qualifier /SomeEnum"]; - 46 [label="Access variable R|/SomeEnum.A1|"]; - 47 [label="Variable declaration: lval flag: R|SomeEnum|"]; - subgraph cluster_12 { - color=blue - 48 [label="Enter when"]; - 49 [label="Access variable R|/flag|"]; - 50 [label="Check not null: R|/flag|!!"]; - subgraph cluster_13 { - color=blue - 51 [label="Enter when branch condition "]; - 52 [label="Access qualifier /SomeEnum"]; - 53 [label="Access variable R|/SomeEnum.A1|"]; - 54 [label="Operator =="]; - 55 [label="Exit when branch condition"]; - } - subgraph cluster_14 { - color=blue - 56 [label="Enter when branch condition "]; - 57 [label="Access qualifier /SomeEnum"]; - 58 [label="Access variable R|/SomeEnum.A2|"]; - 59 [label="Operator =="]; - 60 [label="Exit when branch condition"]; - } - 61 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 62 [label="Enter block"]; - 63 [label="Function call: R|/B.B|()"]; - 64 [label="Exit block"]; - } - 65 [label="Exit when branch result"]; - 66 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 67 [label="Enter block"]; - 68 [label="Function call: R|/B.B|()"]; - 69 [label="Exit block"]; - } - 70 [label="Exit when branch result"]; - 71 [label="Exit when"]; - } - 72 [label="Variable declaration: lval b: R|B|"]; - 73 [label="Access variable R|/b|"]; - 74 [label="Function call: R|/takeB|(...)"]; - 75 [label="Exit function test_2" style="filled" fillcolor=red]; - } - + 43 -> {44}; 44 -> {45}; 45 -> {46}; 46 -> {47}; - 47 -> {48}; + + 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|"]; + subgraph cluster_14 { + color=blue + 52 [label="Enter when"]; + 53 [label="Access variable R|/flag|"]; + 54 [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"]; + } + 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"]; + } + 65 [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"]; + } + 69 [label="Exit when branch result"]; + 70 [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"]; + } + 74 [label="Exit when branch result"]; + 75 [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]; + } + 48 -> {49}; 49 -> {50}; 50 -> {51}; @@ -192,106 +204,110 @@ digraph exhaustiveWhenAndDNNType_kt { 52 -> {53}; 53 -> {54}; 54 -> {55}; - 55 -> {66 56}; + 55 -> {56}; 56 -> {57}; 57 -> {58}; 58 -> {59}; - 59 -> {60}; + 59 -> {70 60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; 63 -> {64}; 64 -> {65}; - 65 -> {71}; + 65 -> {66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; - 69 -> {70}; + 69 -> {75}; 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; - - subgraph cluster_17 { - color=red - 76 [label="Enter function test_3" style="filled" fillcolor=red]; - 77 [label="Access qualifier /SomeEnum"]; - 78 [label="Access variable R|/SomeEnum.A1|"]; - 79 [label="Variable declaration: lval flag: R|SomeEnum|"]; - subgraph cluster_18 { - color=blue - 80 [label="Enter when"]; - 81 [label="Access variable R|/flag|"]; - subgraph cluster_19 { - color=blue - 82 [label="Enter when branch condition "]; - 83 [label="Access qualifier /SomeEnum"]; - 84 [label="Access variable R|/SomeEnum.A1|"]; - 85 [label="Operator =="]; - 86 [label="Exit when branch condition"]; - } - subgraph cluster_20 { - color=blue - 87 [label="Enter when branch condition "]; - 88 [label="Access qualifier /SomeEnum"]; - 89 [label="Access variable R|/SomeEnum.A2|"]; - 90 [label="Operator =="]; - 91 [label="Exit when branch condition"]; - } - 92 [label="Enter when branch result"]; - subgraph cluster_21 { - color=blue - 93 [label="Enter block"]; - 94 [label="Function call: R|/B.B|()"]; - 95 [label="Exit block"]; - } - 96 [label="Exit when branch result"]; - 97 [label="Enter when branch result"]; - subgraph cluster_22 { - color=blue - 98 [label="Enter block"]; - 99 [label="Function call: R|/B.B|()"]; - 100 [label="Exit block"]; - } - 101 [label="Exit when branch result"]; - 102 [label="Exit when"]; - } - 103 [label="Variable declaration: lval b: R|B|"]; - 104 [label="Access variable R|/b|"]; - 105 [label="Function call: R|/takeB|(...)"]; - 106 [label="Exit function test_3" style="filled" fillcolor=red]; - } - + 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; - 79 -> {80}; + + 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|"]; + subgraph cluster_20 { + color=blue + 84 [label="Enter when"]; + 85 [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"]; + } + 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"]; + } + 96 [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"]; + } + 100 [label="Exit when branch result"]; + 101 [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"]; + } + 105 [label="Exit when branch result"]; + 106 [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]; + } + 80 -> {81}; 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; 85 -> {86}; - 86 -> {97 87}; + 86 -> {87}; 87 -> {88}; 88 -> {89}; 89 -> {90}; - 90 -> {91}; + 90 -> {101 91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; 94 -> {95}; 95 -> {96}; - 96 -> {102}; + 96 -> {97}; 97 -> {98}; 98 -> {99}; 99 -> {100}; - 100 -> {101}; + 100 -> {106}; 101 -> {102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; 105 -> {106}; + 106 -> {107}; + 107 -> {108}; + 108 -> {109}; + 109 -> {110}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot index be346f518af..6d4b295078f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot @@ -13,63 +13,69 @@ digraph bangbang_kt { subgraph cluster_1 { color=red - 2 [label="Enter function test_0" style="filled" fillcolor=red]; - 3 [label="Access variable R|/a|"]; - 4 [label="Check not null: R|/a|!!"]; - 5 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 6 [label="Access variable R|/a|"]; - 7 [label="Function call: R|/a|.R|/A.foo|()"]; - 8 [label="Exit function test_0" style="filled" fillcolor=red]; + 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]; } - 2 -> {3}; - 3 -> {4}; 4 -> {5}; 5 -> {6}; 6 -> {7}; 7 -> {8}; + 8 -> {9}; + 9 -> {10}; - subgraph cluster_2 { + subgraph cluster_3 { color=red - 9 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_3 { + 11 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_4 { color=blue - 10 [label="Enter when"]; - subgraph cluster_4 { - color=blue - 11 [label="Enter when branch condition "]; - 12 [label="Access variable R|/a|"]; - 13 [label="Check not null: R|/a|!!"]; - 14 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 15 [label="Exit when branch condition"]; - } - 16 [label="Synthetic else branch"]; - 17 [label="Enter when branch result"]; + 12 [label="Enter when"]; subgraph cluster_5 { color=blue - 18 [label="Enter block"]; - 19 [label="Access variable R|/a|"]; - 20 [label="Function call: R|/a|.R|/A.foo|()"]; - 21 [label="Exit block"]; + 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"]; } - 22 [label="Exit when branch result"]; - 23 [label="Exit when"]; + 18 [label="Synthetic else branch"]; + 19 [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"]; + } + 24 [label="Exit when branch result"]; + 25 [label="Exit when"]; } - 24 [label="Access variable R|/a|"]; - 25 [label="Function call: R|/a|.R|/A.foo|()"]; - 26 [label="Exit function test_1" style="filled" fillcolor=red]; + 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]; } - 9 -> {10}; - 10 -> {11}; 11 -> {12}; 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {17 16}; - 16 -> {23}; - 17 -> {18}; - 18 -> {19}; + 15 -> {16}; + 16 -> {17}; + 17 -> {19 18}; + 18 -> {25}; 19 -> {20}; 20 -> {21}; 21 -> {22}; @@ -77,61 +83,61 @@ digraph bangbang_kt { 23 -> {24}; 24 -> {25}; 25 -> {26}; + 26 -> {27}; + 27 -> {28}; - subgraph cluster_6 { + subgraph cluster_7 { color=red - 27 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_7 { + 29 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_8 { color=blue - 28 [label="Enter when"]; - subgraph cluster_8 { + 30 [label="Enter when"]; + subgraph cluster_9 { color=blue - 29 [label="Enter when branch condition "]; - subgraph cluster_9 { + 31 [label="Enter when branch condition "]; + subgraph cluster_10 { color=blue - 30 [label="Enter &&"]; - 31 [label="Access variable R|/a|"]; - 32 [label="Check not null: R|/a|!!"]; - 33 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 34 [label="Exit left part of &&"]; - 35 [label="Enter right part of &&"]; - 36 [label="Access variable R|/b|"]; - 37 [label="Exit &&"]; + 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 &&"]; } - 38 [label="Exit when branch condition"]; + 40 [label="Exit when branch condition"]; } - 39 [label="Synthetic else branch"]; - 40 [label="Enter when branch result"]; - subgraph cluster_10 { + 41 [label="Synthetic else branch"]; + 42 [label="Enter when branch result"]; + subgraph cluster_11 { color=blue - 41 [label="Enter block"]; - 42 [label="Access variable R|/a|"]; - 43 [label="Function call: R|/a|.R|/A.foo|()"]; - 44 [label="Exit block"]; + 43 [label="Enter block"]; + 44 [label="Access variable R|/a|"]; + 45 [label="Function call: R|/a|.R|/A.foo|()"]; + 46 [label="Exit block"]; } - 45 [label="Exit when branch result"]; - 46 [label="Exit when"]; + 47 [label="Exit when branch result"]; + 48 [label="Exit when"]; } - 47 [label="Access variable R|/a|"]; - 48 [label="Function call: R|/a|.R|/A.foo|()"]; - 49 [label="Exit function test_2" style="filled" fillcolor=red]; + 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]; } - 27 -> {28}; - 28 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {37 35}; + 34 -> {35}; 35 -> {36}; - 36 -> {37}; + 36 -> {39 37}; 37 -> {38}; - 38 -> {40 39}; - 39 -> {46}; - 40 -> {41}; - 41 -> {42}; + 38 -> {39}; + 39 -> {40}; + 40 -> {42 41}; + 41 -> {48}; 42 -> {43}; 43 -> {44}; 44 -> {45}; @@ -139,61 +145,61 @@ digraph bangbang_kt { 46 -> {47}; 47 -> {48}; 48 -> {49}; + 49 -> {50}; + 50 -> {51}; - subgraph cluster_11 { + subgraph cluster_12 { color=red - 50 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_12 { + 52 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_13 { color=blue - 51 [label="Enter when"]; - subgraph cluster_13 { + 53 [label="Enter when"]; + subgraph cluster_14 { color=blue - 52 [label="Enter when branch condition "]; - subgraph cluster_14 { + 54 [label="Enter when branch condition "]; + subgraph cluster_15 { color=blue - 53 [label="Enter &&"]; - 54 [label="Access variable R|/b|"]; - 55 [label="Exit left part of &&"]; - 56 [label="Enter right part of &&"]; - 57 [label="Access variable R|/a|"]; - 58 [label="Check not null: R|/a|!!"]; - 59 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 60 [label="Exit &&"]; + 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 &&"]; } - 61 [label="Exit when branch condition"]; + 63 [label="Exit when branch condition"]; } - 62 [label="Synthetic else branch"]; - 63 [label="Enter when branch result"]; - subgraph cluster_15 { + 64 [label="Synthetic else branch"]; + 65 [label="Enter when branch result"]; + subgraph cluster_16 { color=blue - 64 [label="Enter block"]; - 65 [label="Access variable R|/a|"]; - 66 [label="Function call: R|/a|.R|/A.foo|()"]; - 67 [label="Exit block"]; + 66 [label="Enter block"]; + 67 [label="Access variable R|/a|"]; + 68 [label="Function call: R|/a|.R|/A.foo|()"]; + 69 [label="Exit block"]; } - 68 [label="Exit when branch result"]; - 69 [label="Exit when"]; + 70 [label="Exit when branch result"]; + 71 [label="Exit when"]; } - 70 [label="Access variable R|/a|"]; - 71 [label="Function call: R|/a|.#()"]; - 72 [label="Exit function test_3" style="filled" fillcolor=red]; + 72 [label="Access variable R|/a|"]; + 73 [label="Function call: R|/a|.#()"]; + 74 [label="Exit function test_3" style="filled" fillcolor=red]; } - 50 -> {51}; - 51 -> {52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; - 55 -> {60 56}; + 55 -> {56}; 56 -> {57}; - 57 -> {58}; + 57 -> {62 58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; - 61 -> {63 62}; - 62 -> {69}; - 63 -> {64}; - 64 -> {65}; + 61 -> {62}; + 62 -> {63}; + 63 -> {65 64}; + 64 -> {71}; 65 -> {66}; 66 -> {67}; 67 -> {68}; @@ -201,61 +207,61 @@ digraph bangbang_kt { 69 -> {70}; 70 -> {71}; 71 -> {72}; + 72 -> {73}; + 73 -> {74}; - subgraph cluster_16 { + subgraph cluster_17 { color=red - 73 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_17 { + 75 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_18 { color=blue - 74 [label="Enter when"]; - subgraph cluster_18 { + 76 [label="Enter when"]; + subgraph cluster_19 { color=blue - 75 [label="Enter when branch condition "]; - subgraph cluster_19 { + 77 [label="Enter when branch condition "]; + subgraph cluster_20 { color=blue - 76 [label="Enter ||"]; - 77 [label="Access variable R|/a|"]; - 78 [label="Check not null: R|/a|!!"]; - 79 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 80 [label="Exit left part of ||"]; - 81 [label="Enter right part of ||"]; - 82 [label="Access variable R|/b|"]; - 83 [label="Exit ||"]; + 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 ||"]; } - 84 [label="Exit when branch condition"]; + 86 [label="Exit when branch condition"]; } - 85 [label="Synthetic else branch"]; - 86 [label="Enter when branch result"]; - subgraph cluster_20 { + 87 [label="Synthetic else branch"]; + 88 [label="Enter when branch result"]; + subgraph cluster_21 { color=blue - 87 [label="Enter block"]; - 88 [label="Access variable R|/a|"]; - 89 [label="Function call: R|/a|.R|/A.foo|()"]; - 90 [label="Exit block"]; + 89 [label="Enter block"]; + 90 [label="Access variable R|/a|"]; + 91 [label="Function call: R|/a|.R|/A.foo|()"]; + 92 [label="Exit block"]; } - 91 [label="Exit when branch result"]; - 92 [label="Exit when"]; + 93 [label="Exit when branch result"]; + 94 [label="Exit when"]; } - 93 [label="Access variable R|/a|"]; - 94 [label="Function call: R|/a|.R|/A.foo|()"]; - 95 [label="Exit function test_4" style="filled" fillcolor=red]; + 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]; } - 73 -> {74}; - 74 -> {75}; 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; - 80 -> {83 81}; + 80 -> {81}; 81 -> {82}; - 82 -> {83}; + 82 -> {85 83}; 83 -> {84}; - 84 -> {86 85}; - 85 -> {92}; - 86 -> {87}; - 87 -> {88}; + 84 -> {85}; + 85 -> {86}; + 86 -> {88 87}; + 87 -> {94}; 88 -> {89}; 89 -> {90}; 90 -> {91}; @@ -263,61 +269,61 @@ digraph bangbang_kt { 92 -> {93}; 93 -> {94}; 94 -> {95}; + 95 -> {96}; + 96 -> {97}; - subgraph cluster_21 { + subgraph cluster_22 { color=red - 96 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_22 { + 98 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_23 { color=blue - 97 [label="Enter when"]; - subgraph cluster_23 { + 99 [label="Enter when"]; + subgraph cluster_24 { color=blue - 98 [label="Enter when branch condition "]; - subgraph cluster_24 { + 100 [label="Enter when branch condition "]; + subgraph cluster_25 { color=blue - 99 [label="Enter ||"]; - 100 [label="Access variable R|/b|"]; - 101 [label="Exit left part of ||"]; - 102 [label="Enter right part of ||"]; - 103 [label="Access variable R|/a|"]; - 104 [label="Check not null: R|/a|!!"]; - 105 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 106 [label="Exit ||"]; + 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 ||"]; } - 107 [label="Exit when branch condition"]; + 109 [label="Exit when branch condition"]; } - 108 [label="Synthetic else branch"]; - 109 [label="Enter when branch result"]; - subgraph cluster_25 { + 110 [label="Synthetic else branch"]; + 111 [label="Enter when branch result"]; + subgraph cluster_26 { color=blue - 110 [label="Enter block"]; - 111 [label="Access variable R|/a|"]; - 112 [label="Function call: R|/a|.#()"]; - 113 [label="Exit block"]; + 112 [label="Enter block"]; + 113 [label="Access variable R|/a|"]; + 114 [label="Function call: R|/a|.#()"]; + 115 [label="Exit block"]; } - 114 [label="Exit when branch result"]; - 115 [label="Exit when"]; + 116 [label="Exit when branch result"]; + 117 [label="Exit when"]; } - 116 [label="Access variable R|/a|"]; - 117 [label="Function call: R|/a|.#()"]; - 118 [label="Exit function test_5" style="filled" fillcolor=red]; + 118 [label="Access variable R|/a|"]; + 119 [label="Function call: R|/a|.#()"]; + 120 [label="Exit function test_5" style="filled" fillcolor=red]; } - 96 -> {97}; - 97 -> {98}; 98 -> {99}; 99 -> {100}; 100 -> {101}; - 101 -> {106 102}; + 101 -> {102}; 102 -> {103}; - 103 -> {104}; + 103 -> {108 104}; 104 -> {105}; 105 -> {106}; 106 -> {107}; - 107 -> {109 108}; - 108 -> {115}; - 109 -> {110}; - 110 -> {111}; + 107 -> {108}; + 108 -> {109}; + 109 -> {111 110}; + 110 -> {117}; 111 -> {112}; 112 -> {113}; 113 -> {114}; @@ -325,33 +331,35 @@ digraph bangbang_kt { 115 -> {116}; 116 -> {117}; 117 -> {118}; - - subgraph cluster_26 { - color=red - 119 [label="Enter function test_6" style="filled" fillcolor=red]; - 120 [label="Access variable R|/x|"]; - 121 [label="Check not null: R|/x|!!"]; - 122 [label="Function call: R|/x|!!.R|/A.foo|()"]; - 123 [label="Exit function test_6" style="filled" fillcolor=red]; - } - + 118 -> {119}; 119 -> {120}; - 120 -> {121}; - 121 -> {122}; - 122 -> {123}; subgraph cluster_27 { color=red - 124 [label="Enter function test_7" style="filled" fillcolor=red]; - 125 [label="Access variable R|/x|"]; - 126 [label="Check not null: R|/x|!!"]; - 127 [label="Function call: R|/x|!!.R|/A.foo|()"]; - 128 [label="Exit function test_7" style="filled" fillcolor=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]; } + 121 -> {122}; + 122 -> {123}; + 123 -> {124}; 124 -> {125}; - 125 -> {126}; + + 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]; + } + 126 -> {127}; 127 -> {128}; + 128 -> {129}; + 129 -> {130}; } 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 1e84e6be66f..746dbad6c09 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot @@ -21,816 +21,840 @@ digraph booleanOperators_kt { subgraph cluster_2 { color=red - 4 [label="Enter function bar" style="filled" fillcolor=red]; - 5 [label="Exit function bar" style="filled" fillcolor=red]; + 4 [label="Enter class A" style="filled" fillcolor=red]; + 5 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5}; + 4 -> {5} [color=green]; subgraph cluster_3 { color=red - 6 [label="Enter function baz" style="filled" fillcolor=red]; - 7 [label="Exit function baz" style="filled" fillcolor=red]; + 6 [label="Enter function bar" style="filled" fillcolor=red]; + 7 [label="Exit function bar" style="filled" fillcolor=red]; } 6 -> {7}; subgraph cluster_4 { color=red - 8 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_5 { - color=blue - 9 [label="Enter when"]; - subgraph cluster_6 { - color=blue - 10 [label="Enter when branch condition "]; - subgraph cluster_7 { - color=blue - 11 [label="Enter &&"]; - 12 [label="Access variable R|/x|"]; - 13 [label="Type operator: (R|/x| is R|B|)"]; - 14 [label="Exit left part of &&"]; - 15 [label="Enter right part of &&"]; - 16 [label="Access variable R|/x|"]; - 17 [label="Type operator: (R|/x| is R|C|)"]; - 18 [label="Exit &&"]; - } - 19 [label="Exit when branch condition"]; - } - 20 [label="Synthetic else branch"]; - 21 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 22 [label="Enter block"]; - 23 [label="Access variable R|/x|"]; - 24 [label="Function call: R|/x|.R|/A.foo|()"]; - 25 [label="Access variable R|/x|"]; - 26 [label="Function call: R|/x|.R|/B.bar|()"]; - 27 [label="Access variable R|/x|"]; - 28 [label="Function call: R|/x|.R|/C.baz|()"]; - 29 [label="Exit block"]; - } - 30 [label="Exit when branch result"]; - 31 [label="Exit when"]; - } - 32 [label="Exit function test_1" style="filled" fillcolor=red]; + 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 { + color=red + 10 [label="Enter function baz" style="filled" fillcolor=red]; + 11 [label="Exit function baz" style="filled" fillcolor=red]; } - 8 -> {9}; - 9 -> {10}; 10 -> {11}; - 11 -> {12}; - 12 -> {13}; - 13 -> {14}; - 14 -> {18 15}; + + subgraph cluster_6 { + color=red + 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 { + color=red + 14 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_8 { + color=blue + 15 [label="Enter when"]; + subgraph cluster_9 { + color=blue + 16 [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 &&"]; + } + 25 [label="Exit when branch condition"]; + } + 26 [label="Synthetic else branch"]; + 27 [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"]; + } + 36 [label="Exit when branch result"]; + 37 [label="Exit when"]; + } + 38 [label="Exit function test_1" style="filled" fillcolor=red]; + } + + 14 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; - 19 -> {21 20}; - 20 -> {31}; + 19 -> {20}; + 20 -> {24 21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {26}; - 26 -> {27}; + 25 -> {27 26}; + 26 -> {37}; 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; - - subgraph cluster_9 { - color=red - 33 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_10 { - color=blue - 34 [label="Enter when"]; - subgraph cluster_11 { - color=blue - 35 [label="Enter when branch condition "]; - subgraph cluster_12 { - color=blue - 36 [label="Enter ||"]; - 37 [label="Access variable R|/x|"]; - 38 [label="Type operator: (R|/x| is R|B|)"]; - 39 [label="Exit left part of ||"]; - 40 [label="Enter right part of ||"]; - 41 [label="Access variable R|/x|"]; - 42 [label="Type operator: (R|/x| is R|C|)"]; - 43 [label="Exit ||"]; - } - 44 [label="Exit when branch condition"]; - } - 45 [label="Synthetic else branch"]; - 46 [label="Enter when branch result"]; - subgraph cluster_13 { - color=blue - 47 [label="Enter block"]; - 48 [label="Access variable R|/x|"]; - 49 [label="Function call: R|/x|.R|/A.foo|()"]; - 50 [label="Access variable R|/x|"]; - 51 [label="Function call: R|/x|.#()"]; - 52 [label="Access variable R|/x|"]; - 53 [label="Function call: R|/x|.#()"]; - 54 [label="Exit block"]; - } - 55 [label="Exit when branch result"]; - 56 [label="Exit when"]; - } - 57 [label="Exit function test_2" style="filled" fillcolor=red]; - } - + 32 -> {33}; 33 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; 37 -> {38}; - 38 -> {39}; - 39 -> {43 40}; + + subgraph cluster_12 { + color=red + 39 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_13 { + color=blue + 40 [label="Enter when"]; + subgraph cluster_14 { + color=blue + 41 [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 ||"]; + } + 50 [label="Exit when branch condition"]; + } + 51 [label="Synthetic else branch"]; + 52 [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"]; + } + 61 [label="Exit when branch result"]; + 62 [label="Exit when"]; + } + 63 [label="Exit function test_2" style="filled" fillcolor=red]; + } + + 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; - 44 -> {46 45}; - 45 -> {56}; + 44 -> {45}; + 45 -> {49 46}; 46 -> {47}; 47 -> {48}; 48 -> {49}; 49 -> {50}; - 50 -> {51}; - 51 -> {52}; + 50 -> {52 51}; + 51 -> {62}; 52 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - - subgraph cluster_14 { - color=red - 58 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_15 { - color=blue - 59 [label="Enter when"]; - subgraph cluster_16 { - color=blue - 60 [label="Enter when branch condition "]; - 61 [label="Access variable R|/x|"]; - 62 [label="Type operator: (R|/x| !is R|A|)"]; - 63 [label="Function call: (R|/x| !is R|A|).R|kotlin/Boolean.not|()"]; - 64 [label="Exit when branch condition"]; - } - 65 [label="Synthetic else branch"]; - 66 [label="Enter when branch result"]; - subgraph cluster_17 { - color=blue - 67 [label="Enter block"]; - 68 [label="Access variable R|/x|"]; - 69 [label="Function call: R|/x|.R|/A.foo|()"]; - 70 [label="Exit block"]; - } - 71 [label="Exit when branch result"]; - 72 [label="Exit when"]; - } - 73 [label="Exit function test_3" style="filled" fillcolor=red]; - } - + 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; - 63 -> {64}; - 64 -> {66 65}; - 65 -> {72}; + + subgraph cluster_17 { + color=red + 64 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_18 { + color=blue + 65 [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"]; + } + 71 [label="Synthetic else branch"]; + 72 [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"]; + } + 77 [label="Exit when branch result"]; + 78 [label="Exit when"]; + } + 79 [label="Exit function test_3" style="filled" fillcolor=red]; + } + + 64 -> {65}; + 65 -> {66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {71}; - 71 -> {72}; + 70 -> {72 71}; + 71 -> {78}; 72 -> {73}; - - subgraph cluster_18 { - color=red - 74 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_19 { - color=blue - 75 [label="Enter when"]; - subgraph cluster_20 { - color=blue - 76 [label="Enter when branch condition "]; - subgraph cluster_21 { - color=blue - 77 [label="Enter ||"]; - 78 [label="Access variable R|/x|"]; - 79 [label="Type operator: (R|/x| !is R|kotlin/String|)"]; - 80 [label="Exit left part of ||"]; - 81 [label="Enter right part of ||"]; - 82 [label="Access variable R|/x|"]; - 83 [label="Access variable R|kotlin/String.length|"]; - 84 [label="Const: Int(0)"]; - 85 [label="Operator =="]; - 86 [label="Exit ||"]; - } - 87 [label="Exit when branch condition"]; - } - 88 [label="Synthetic else branch"]; - 89 [label="Enter when branch result"]; - subgraph cluster_22 { - color=blue - 90 [label="Enter block"]; - 91 [label="Access variable R|/x|"]; - 92 [label="Access variable #"]; - 93 [label="Exit block"]; - } - 94 [label="Exit when branch result"]; - 95 [label="Exit when"]; - } - 96 [label="Access variable R|/x|"]; - 97 [label="Access variable #"]; - 98 [label="Exit function test_4" style="filled" fillcolor=red]; - } - + 73 -> {74}; 74 -> {75}; 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; - 79 -> {80}; - 80 -> {86 81}; + + subgraph cluster_21 { + color=red + 80 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_22 { + color=blue + 81 [label="Enter when"]; + subgraph cluster_23 { + color=blue + 82 [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 ||"]; + } + 93 [label="Exit when branch condition"]; + } + 94 [label="Synthetic else branch"]; + 95 [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"]; + } + 100 [label="Exit when branch result"]; + 101 [label="Exit when"]; + } + 102 [label="Access variable R|/x|"]; + 103 [label="Access variable #"]; + 104 [label="Exit function test_4" style="filled" fillcolor=red]; + } + + 80 -> {81}; 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; 85 -> {86}; - 86 -> {87}; - 87 -> {89 88}; - 88 -> {95}; + 86 -> {92 87}; + 87 -> {88}; + 88 -> {89}; 89 -> {90}; 90 -> {91}; 91 -> {92}; 92 -> {93}; - 93 -> {94}; - 94 -> {95}; + 93 -> {95 94}; + 94 -> {101}; 95 -> {96}; 96 -> {97}; 97 -> {98}; - - subgraph cluster_23 { - color=red - 99 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_24 { - color=blue - 100 [label="Enter when"]; - subgraph cluster_25 { - color=blue - 101 [label="Enter when branch condition "]; - subgraph cluster_26 { - color=blue - 102 [label="Enter &&"]; - 103 [label="Access variable R|/x|"]; - 104 [label="Type operator: (R|/x| is R|A|)"]; - 105 [label="Exit left part of &&"]; - 106 [label="Enter right part of &&"]; - 107 [label="Access variable R|/x|"]; - 108 [label="Function call: R|/x|.R|/A.bool|()"]; - 109 [label="Exit &&"]; - } - 110 [label="Exit when branch condition"]; - } - 111 [label="Synthetic else branch"]; - 112 [label="Enter when branch result"]; - subgraph cluster_27 { - color=blue - 113 [label="Enter block"]; - 114 [label="Access variable R|/x|"]; - 115 [label="Function call: R|/x|.R|/A.foo|()"]; - 116 [label="Exit block"]; - } - 117 [label="Exit when branch result"]; - 118 [label="Exit when"]; - } - 119 [label="Exit function test_5" style="filled" fillcolor=red]; - } - + 98 -> {99}; 99 -> {100}; 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; - 104 -> {105}; - 105 -> {109 106}; + + subgraph cluster_26 { + color=red + 105 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_27 { + color=blue + 106 [label="Enter when"]; + subgraph cluster_28 { + color=blue + 107 [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 &&"]; + } + 116 [label="Exit when branch condition"]; + } + 117 [label="Synthetic else branch"]; + 118 [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"]; + } + 123 [label="Exit when branch result"]; + 124 [label="Exit when"]; + } + 125 [label="Exit function test_5" style="filled" fillcolor=red]; + } + + 105 -> {106}; 106 -> {107}; 107 -> {108}; 108 -> {109}; 109 -> {110}; - 110 -> {112 111}; - 111 -> {118}; + 110 -> {111}; + 111 -> {115 112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; - 116 -> {117}; - 117 -> {118}; + 116 -> {118 117}; + 117 -> {124}; 118 -> {119}; - - subgraph cluster_28 { - color=red - 120 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_29 { - color=blue - 121 [label="Enter when"]; - subgraph cluster_30 { - color=blue - 122 [label="Enter when branch condition "]; - 123 [label="Access variable R|/x|"]; - 124 [label="Type operator: (R|/x| !is R|A|)"]; - 125 [label="Function call: (R|/x| !is R|A|).R|kotlin/Boolean.not|()"]; - 126 [label="Exit when branch condition"]; - } - 127 [label="Synthetic else branch"]; - 128 [label="Enter when branch result"]; - subgraph cluster_31 { - color=blue - 129 [label="Enter block"]; - 130 [label="Access variable R|/x|"]; - 131 [label="Function call: R|/x|.R|/A.foo|()"]; - 132 [label="Exit block"]; - } - 133 [label="Exit when branch result"]; - 134 [label="Exit when"]; - } - 135 [label="Exit function test_6" style="filled" fillcolor=red]; - } - + 119 -> {120}; 120 -> {121}; 121 -> {122}; 122 -> {123}; 123 -> {124}; 124 -> {125}; - 125 -> {126}; - 126 -> {128 127}; - 127 -> {134}; + + subgraph cluster_31 { + color=red + 126 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_32 { + color=blue + 127 [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"]; + } + 133 [label="Synthetic else branch"]; + 134 [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"]; + } + 139 [label="Exit when branch result"]; + 140 [label="Exit when"]; + } + 141 [label="Exit function test_6" style="filled" fillcolor=red]; + } + + 126 -> {127}; + 127 -> {128}; 128 -> {129}; 129 -> {130}; 130 -> {131}; 131 -> {132}; - 132 -> {133}; - 133 -> {134}; + 132 -> {134 133}; + 133 -> {140}; 134 -> {135}; - - subgraph cluster_32 { - color=red - 136 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_33 { - color=blue - 137 [label="Enter when"]; - subgraph cluster_34 { - color=blue - 138 [label="Enter when branch condition "]; - subgraph cluster_35 { - color=blue - 139 [label="Enter ||"]; - 140 [label="Access variable R|/x|"]; - 141 [label="Type operator: (R|/x| is R|A|)"]; - 142 [label="Exit left part of ||"]; - 143 [label="Enter right part of ||"]; - 144 [label="Const: Boolean(false)"]; - 145 [label="Exit ||"]; - } - 146 [label="Exit when branch condition"]; - } - 147 [label="Synthetic else branch"]; - 148 [label="Enter when branch result"]; - subgraph cluster_36 { - color=blue - 149 [label="Enter block"]; - 150 [label="Access variable R|/x|"]; - 151 [label="Function call: R|/x|.#()"]; - 152 [label="Exit block"]; - } - 153 [label="Exit when branch result"]; - 154 [label="Exit when"]; - } - 155 [label="Exit function test_7" style="filled" fillcolor=red]; - } - + 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; 139 -> {140}; 140 -> {141}; - 141 -> {142}; - 142 -> {145 143}; + + subgraph cluster_35 { + color=red + 142 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_36 { + color=blue + 143 [label="Enter when"]; + subgraph cluster_37 { + color=blue + 144 [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 ||"]; + } + 152 [label="Exit when branch condition"]; + } + 153 [label="Synthetic else branch"]; + 154 [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"]; + } + 159 [label="Exit when branch result"]; + 160 [label="Exit when"]; + } + 161 [label="Exit function test_7" style="filled" fillcolor=red]; + } + + 142 -> {143}; 143 -> {144}; 144 -> {145}; 145 -> {146}; - 146 -> {148 147}; - 147 -> {154}; - 148 -> {149}; + 146 -> {147}; + 147 -> {148}; + 148 -> {151 149}; 149 -> {150}; 150 -> {151}; 151 -> {152}; - 152 -> {153}; - 153 -> {154}; + 152 -> {154 153}; + 153 -> {160}; 154 -> {155}; - - subgraph cluster_37 { - color=red - 156 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_38 { - color=blue - 157 [label="Enter when"]; - subgraph cluster_39 { - color=blue - 158 [label="Enter when branch condition "]; - subgraph cluster_40 { - color=blue - 159 [label="Enter ||"]; - 160 [label="Const: Boolean(false)"]; - 161 [label="Exit left part of ||"]; - 162 [label="Enter right part of ||"]; - 163 [label="Access variable R|/x|"]; - 164 [label="Type operator: (R|/x| is R|A|)"]; - 165 [label="Exit ||"]; - } - 166 [label="Exit when branch condition"]; - } - 167 [label="Synthetic else branch"]; - 168 [label="Enter when branch result"]; - subgraph cluster_41 { - color=blue - 169 [label="Enter block"]; - 170 [label="Access variable R|/x|"]; - 171 [label="Function call: R|/x|.#()"]; - 172 [label="Exit block"]; - } - 173 [label="Exit when branch result"]; - 174 [label="Exit when"]; - } - 175 [label="Exit function test_8" style="filled" fillcolor=red]; - } - + 155 -> {156}; 156 -> {157}; 157 -> {158}; 158 -> {159}; 159 -> {160}; 160 -> {161}; - 161 -> {162}; - 161 -> {165} [style=dotted]; + + subgraph cluster_40 { + color=red + 162 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_41 { + color=blue + 163 [label="Enter when"]; + subgraph cluster_42 { + color=blue + 164 [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 ||"]; + } + 172 [label="Exit when branch condition"]; + } + 173 [label="Synthetic else branch"]; + 174 [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"]; + } + 179 [label="Exit when branch result"]; + 180 [label="Exit when"]; + } + 181 [label="Exit function test_8" style="filled" fillcolor=red]; + } + 162 -> {163}; 163 -> {164}; 164 -> {165}; 165 -> {166}; - 166 -> {168 167}; - 167 -> {174}; + 166 -> {167}; + 167 -> {168}; + 167 -> {171} [style=dotted]; 168 -> {169}; 169 -> {170}; 170 -> {171}; 171 -> {172}; - 172 -> {173}; - 173 -> {174}; + 172 -> {174 173}; + 173 -> {180}; 174 -> {175}; - - subgraph cluster_42 { - color=red - 176 [label="Enter function test_9" style="filled" fillcolor=red]; - subgraph cluster_43 { - color=blue - 177 [label="Enter when"]; - subgraph cluster_44 { - color=blue - 178 [label="Enter when branch condition "]; - subgraph cluster_45 { - color=blue - 179 [label="Enter ||"]; - 180 [label="Access variable R|/x|"]; - 181 [label="Type operator: (R|/x| is R|A|)"]; - 182 [label="Exit left part of ||"]; - 183 [label="Enter right part of ||"]; - 184 [label="Const: Boolean(true)"]; - 185 [label="Exit ||"]; - } - 186 [label="Exit when branch condition"]; - } - 187 [label="Synthetic else branch"]; - 188 [label="Enter when branch result"]; - subgraph cluster_46 { - color=blue - 189 [label="Enter block"]; - 190 [label="Access variable R|/x|"]; - 191 [label="Function call: R|/x|.#()"]; - 192 [label="Exit block"]; - } - 193 [label="Exit when branch result"]; - 194 [label="Exit when"]; - } - 195 [label="Exit function test_9" style="filled" fillcolor=red]; - } - + 175 -> {176}; 176 -> {177}; 177 -> {178}; 178 -> {179}; 179 -> {180}; 180 -> {181}; - 181 -> {182}; - 182 -> {185 183}; + + subgraph cluster_45 { + color=red + 182 [label="Enter function test_9" style="filled" fillcolor=red]; + subgraph cluster_46 { + color=blue + 183 [label="Enter when"]; + subgraph cluster_47 { + color=blue + 184 [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 ||"]; + } + 192 [label="Exit when branch condition"]; + } + 193 [label="Synthetic else branch"]; + 194 [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"]; + } + 199 [label="Exit when branch result"]; + 200 [label="Exit when"]; + } + 201 [label="Exit function test_9" style="filled" fillcolor=red]; + } + + 182 -> {183}; 183 -> {184}; 184 -> {185}; 185 -> {186}; - 186 -> {188 187}; - 187 -> {194}; - 188 -> {189}; + 186 -> {187}; + 187 -> {188}; + 188 -> {191 189}; 189 -> {190}; 190 -> {191}; 191 -> {192}; - 192 -> {193}; - 193 -> {194}; + 192 -> {194 193}; + 193 -> {200}; 194 -> {195}; - - subgraph cluster_47 { - color=red - 196 [label="Enter function test_10" style="filled" fillcolor=red]; - subgraph cluster_48 { - color=blue - 197 [label="Enter when"]; - subgraph cluster_49 { - color=blue - 198 [label="Enter when branch condition "]; - subgraph cluster_50 { - color=blue - 199 [label="Enter ||"]; - 200 [label="Const: Boolean(true)"]; - 201 [label="Exit left part of ||"]; - 202 [label="Enter right part of ||" style="filled" fillcolor=gray]; - 203 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 204 [label="Type operator: (R|/x| is R|A|)" style="filled" fillcolor=gray]; - 205 [label="Exit ||"]; - } - 206 [label="Exit when branch condition"]; - } - 207 [label="Synthetic else branch"]; - 208 [label="Enter when branch result"]; - subgraph cluster_51 { - color=blue - 209 [label="Enter block"]; - 210 [label="Access variable R|/x|"]; - 211 [label="Function call: R|/x|.#()"]; - 212 [label="Exit block"]; - } - 213 [label="Exit when branch result"]; - 214 [label="Exit when"]; - } - 215 [label="Exit function test_10" style="filled" fillcolor=red]; - } - + 195 -> {196}; 196 -> {197}; 197 -> {198}; 198 -> {199}; 199 -> {200}; 200 -> {201}; - 201 -> {205}; - 201 -> {202} [style=dotted]; - 202 -> {203} [style=dotted]; - 203 -> {204} [style=dotted]; - 204 -> {205} [style=dotted]; - 205 -> {206}; - 206 -> {208 207}; - 207 -> {214}; - 208 -> {209}; - 209 -> {210}; - 210 -> {211}; - 211 -> {212}; - 212 -> {213}; - 213 -> {214}; - 214 -> {215}; - subgraph cluster_52 { + subgraph cluster_50 { color=red - 216 [label="Enter function test_11" style="filled" fillcolor=red]; - subgraph cluster_53 { + 202 [label="Enter function test_10" style="filled" fillcolor=red]; + subgraph cluster_51 { color=blue - 217 [label="Enter when"]; + 203 [label="Enter when"]; + subgraph cluster_52 { + color=blue + 204 [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 ||"]; + } + 212 [label="Exit when branch condition"]; + } + 213 [label="Synthetic else branch"]; + 214 [label="Enter when branch result"]; subgraph cluster_54 { color=blue - 218 [label="Enter when branch condition "]; - subgraph cluster_55 { - color=blue - 219 [label="Enter &&"]; - 220 [label="Const: Boolean(false)"]; - 221 [label="Exit left part of &&"]; - 222 [label="Enter right part of &&" style="filled" fillcolor=gray]; - 223 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 224 [label="Type operator: (R|/x| is R|A|)" style="filled" fillcolor=gray]; - 225 [label="Exit &&"]; - } - 226 [label="Exit when branch condition"]; + 215 [label="Enter block"]; + 216 [label="Access variable R|/x|"]; + 217 [label="Function call: R|/x|.#()"]; + 218 [label="Exit block"]; } - 227 [label="Synthetic else branch"]; - 228 [label="Enter when branch result"]; - subgraph cluster_56 { - color=blue - 229 [label="Enter block"]; - 230 [label="Access variable R|/x|"]; - 231 [label="Function call: R|/x|.#()"]; - 232 [label="Exit block"]; - } - 233 [label="Exit when branch result"]; - 234 [label="Exit when"]; + 219 [label="Exit when branch result"]; + 220 [label="Exit when"]; } - 235 [label="Exit function test_11" style="filled" fillcolor=red]; + 221 [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]; + 210 -> {211} [style=dotted]; + 211 -> {212}; + 212 -> {214 213}; + 213 -> {220}; + 214 -> {215}; + 215 -> {216}; 216 -> {217}; 217 -> {218}; 218 -> {219}; 219 -> {220}; 220 -> {221}; - 221 -> {225}; - 221 -> {222} [style=dotted]; - 222 -> {223} [style=dotted]; - 223 -> {224} [style=dotted]; - 224 -> {225} [style=dotted]; - 225 -> {226}; - 226 -> {228 227}; - 227 -> {234}; - 228 -> {229}; - 229 -> {230}; - 230 -> {231}; - 231 -> {232}; - 232 -> {233}; - 233 -> {234}; - 234 -> {235}; - subgraph cluster_57 { + subgraph cluster_55 { color=red - 236 [label="Enter function test_12" style="filled" fillcolor=red]; - subgraph cluster_58 { + 222 [label="Enter function test_11" style="filled" fillcolor=red]; + subgraph cluster_56 { color=blue - 237 [label="Enter when"]; + 223 [label="Enter when"]; + subgraph cluster_57 { + color=blue + 224 [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 &&"]; + } + 232 [label="Exit when branch condition"]; + } + 233 [label="Synthetic else branch"]; + 234 [label="Enter when branch result"]; subgraph cluster_59 { color=blue - 238 [label="Enter when branch condition "]; - subgraph cluster_60 { - color=blue - 239 [label="Enter &&"]; - 240 [label="Access variable R|/x|"]; - 241 [label="Type operator: (R|/x| is R|A|)"]; - 242 [label="Exit left part of &&"]; - 243 [label="Enter right part of &&"]; - 244 [label="Const: Boolean(false)"]; - 245 [label="Exit &&"]; - } - 246 [label="Exit when branch condition"]; + 235 [label="Enter block"]; + 236 [label="Access variable R|/x|"]; + 237 [label="Function call: R|/x|.#()"]; + 238 [label="Exit block"]; } - 247 [label="Synthetic else branch"]; - 248 [label="Enter when branch result"]; - subgraph cluster_61 { - color=blue - 249 [label="Enter block"]; - 250 [label="Access variable R|/x|"]; - 251 [label="Function call: R|/x|.R|/A.foo|()"]; - 252 [label="Exit block"]; - } - 253 [label="Exit when branch result"]; - 254 [label="Exit when"]; + 239 [label="Exit when branch result"]; + 240 [label="Exit when"]; } - 255 [label="Exit function test_12" style="filled" fillcolor=red]; + 241 [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]; + 230 -> {231} [style=dotted]; + 231 -> {232}; + 232 -> {234 233}; + 233 -> {240}; + 234 -> {235}; + 235 -> {236}; 236 -> {237}; 237 -> {238}; 238 -> {239}; 239 -> {240}; 240 -> {241}; - 241 -> {242}; - 242 -> {245 243}; + + subgraph cluster_60 { + color=red + 242 [label="Enter function test_12" style="filled" fillcolor=red]; + subgraph cluster_61 { + color=blue + 243 [label="Enter when"]; + subgraph cluster_62 { + color=blue + 244 [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 &&"]; + } + 252 [label="Exit when branch condition"]; + } + 253 [label="Synthetic else branch"]; + 254 [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"]; + } + 259 [label="Exit when branch result"]; + 260 [label="Exit when"]; + } + 261 [label="Exit function test_12" style="filled" fillcolor=red]; + } + + 242 -> {243}; 243 -> {244}; 244 -> {245}; 245 -> {246}; - 246 -> {248 247}; - 247 -> {254}; - 248 -> {249}; + 246 -> {247}; + 247 -> {248}; + 248 -> {251 249}; 249 -> {250}; 250 -> {251}; 251 -> {252}; - 252 -> {253}; - 253 -> {254}; + 252 -> {254 253}; + 253 -> {260}; 254 -> {255}; - - subgraph cluster_62 { - color=red - 256 [label="Enter function test_13" style="filled" fillcolor=red]; - subgraph cluster_63 { - color=blue - 257 [label="Enter when"]; - subgraph cluster_64 { - color=blue - 258 [label="Enter when branch condition "]; - subgraph cluster_65 { - color=blue - 259 [label="Enter &&"]; - 260 [label="Const: Boolean(true)"]; - 261 [label="Exit left part of &&"]; - 262 [label="Enter right part of &&"]; - 263 [label="Access variable R|/x|"]; - 264 [label="Type operator: (R|/x| is R|A|)"]; - 265 [label="Exit &&"]; - } - 266 [label="Exit when branch condition"]; - } - 267 [label="Synthetic else branch"]; - 268 [label="Enter when branch result"]; - subgraph cluster_66 { - color=blue - 269 [label="Enter block"]; - 270 [label="Access variable R|/x|"]; - 271 [label="Function call: R|/x|.R|/A.foo|()"]; - 272 [label="Exit block"]; - } - 273 [label="Exit when branch result"]; - 274 [label="Exit when"]; - } - 275 [label="Exit function test_13" style="filled" fillcolor=red]; - } - + 255 -> {256}; 256 -> {257}; 257 -> {258}; 258 -> {259}; 259 -> {260}; 260 -> {261}; - 261 -> {262}; - 261 -> {265} [style=dotted]; + + subgraph cluster_65 { + color=red + 262 [label="Enter function test_13" style="filled" fillcolor=red]; + subgraph cluster_66 { + color=blue + 263 [label="Enter when"]; + subgraph cluster_67 { + color=blue + 264 [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 &&"]; + } + 272 [label="Exit when branch condition"]; + } + 273 [label="Synthetic else branch"]; + 274 [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"]; + } + 279 [label="Exit when branch result"]; + 280 [label="Exit when"]; + } + 281 [label="Exit function test_13" style="filled" fillcolor=red]; + } + 262 -> {263}; 263 -> {264}; 264 -> {265}; 265 -> {266}; - 266 -> {268 267}; - 267 -> {274}; + 266 -> {267}; + 267 -> {268}; + 267 -> {271} [style=dotted]; 268 -> {269}; 269 -> {270}; 270 -> {271}; 271 -> {272}; - 272 -> {273}; - 273 -> {274}; + 272 -> {274 273}; + 273 -> {280}; 274 -> {275}; - - subgraph cluster_67 { - color=red - 276 [label="Enter function test_14" style="filled" fillcolor=red]; - subgraph cluster_68 { - color=blue - 277 [label="Enter when"]; - subgraph cluster_69 { - color=blue - 278 [label="Enter when branch condition "]; - subgraph cluster_70 { - color=blue - 279 [label="Enter &&"]; - 280 [label="Access variable R|/x|"]; - 281 [label="Type operator: (R|/x| is R|A|)"]; - 282 [label="Exit left part of &&"]; - 283 [label="Enter right part of &&"]; - 284 [label="Const: Boolean(false)"]; - 285 [label="Exit &&"]; - } - 286 [label="Exit when branch condition"]; - } - 287 [label="Synthetic else branch"]; - 288 [label="Enter when branch result"]; - subgraph cluster_71 { - color=blue - 289 [label="Enter block"]; - 290 [label="Access variable R|/x|"]; - 291 [label="Function call: R|/x|.R|/A.foo|()"]; - 292 [label="Exit block"]; - } - 293 [label="Exit when branch result"]; - 294 [label="Exit when"]; - } - 295 [label="Exit function test_14" style="filled" fillcolor=red]; - } - + 275 -> {276}; 276 -> {277}; 277 -> {278}; 278 -> {279}; 279 -> {280}; 280 -> {281}; - 281 -> {282}; - 282 -> {285 283}; + + subgraph cluster_70 { + color=red + 282 [label="Enter function test_14" style="filled" fillcolor=red]; + subgraph cluster_71 { + color=blue + 283 [label="Enter when"]; + subgraph cluster_72 { + color=blue + 284 [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 &&"]; + } + 292 [label="Exit when branch condition"]; + } + 293 [label="Synthetic else branch"]; + 294 [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"]; + } + 299 [label="Exit when branch result"]; + 300 [label="Exit when"]; + } + 301 [label="Exit function test_14" style="filled" fillcolor=red]; + } + + 282 -> {283}; 283 -> {284}; 284 -> {285}; 285 -> {286}; - 286 -> {288 287}; - 287 -> {294}; - 288 -> {289}; + 286 -> {287}; + 287 -> {288}; + 288 -> {291 289}; 289 -> {290}; 290 -> {291}; 291 -> {292}; - 292 -> {293}; - 293 -> {294}; + 292 -> {294 293}; + 293 -> {300}; 294 -> {295}; + 295 -> {296}; + 296 -> {297}; + 297 -> {298}; + 298 -> {299}; + 299 -> {300}; + 300 -> {301}; } 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 8a52b28c58e..138c79f8a5e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot @@ -29,554 +29,561 @@ digraph equalsToBoolean_kt { subgraph cluster_3 { color=red - 6 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_4 { - color=blue - 7 [label="Enter when"]; - subgraph cluster_5 { - color=blue - 8 [label="Enter when branch condition "]; - 9 [label="Access variable R|/b|"]; - 10 [label="Const: Boolean(true)"]; - 11 [label="Operator =="]; - 12 [label="Const: Boolean(true)"]; - 13 [label="Operator =="]; - 14 [label="Exit when branch condition"]; - } - subgraph cluster_6 { - color=blue - 15 [label="Enter when branch condition else"]; - 16 [label="Exit when branch condition"]; - } - 17 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 18 [label="Enter block"]; - 19 [label="Access variable R|/b|"]; - 20 [label="Function call: R|/b|.#()"]; - 21 [label="Exit block"]; - } - 22 [label="Exit when branch result"]; - 23 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 24 [label="Enter block"]; - 25 [label="Access variable R|/b|"]; - 26 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 27 [label="Exit block"]; - } - 28 [label="Exit when branch result"]; - 29 [label="Exit when"]; - } - 30 [label="Exit function test_1" style="filled" fillcolor=red]; + 6 [label="Enter class A" style="filled" fillcolor=red]; + 7 [label="Exit class A" style="filled" fillcolor=red]; + } + + + subgraph cluster_4 { + color=red + 8 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 9 [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 =="]; + 14 [label="Const: Boolean(true)"]; + 15 [label="Operator =="]; + 16 [label="Exit when branch condition"]; + } + subgraph cluster_7 { + color=blue + 17 [label="Enter when branch condition else"]; + 18 [label="Exit when branch condition"]; + } + 19 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 20 [label="Enter block"]; + 21 [label="Access variable R|/b|"]; + 22 [label="Function call: R|/b|.#()"]; + 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"]; + } + 32 [label="Exit function test_1" style="filled" fillcolor=red]; } - 6 -> {7}; - 7 -> {8}; 8 -> {9}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; 13 -> {14}; - 14 -> {23 15}; + 14 -> {15}; 15 -> {16}; - 16 -> {17}; + 16 -> {25 17}; 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {29}; + 22 -> {23}; 23 -> {24}; - 24 -> {25}; + 24 -> {31}; 25 -> {26}; 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; + 30 -> {31}; + 31 -> {32}; - subgraph cluster_9 { + subgraph cluster_10 { color=red - 31 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_10 { + 33 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_11 { color=blue - 32 [label="Enter when"]; - subgraph cluster_11 { - color=blue - 33 [label="Enter when branch condition "]; - 34 [label="Access variable R|/b|"]; - 35 [label="Const: Boolean(true)"]; - 36 [label="Operator =="]; - 37 [label="Const: Boolean(true)"]; - 38 [label="Operator !="]; - 39 [label="Exit when branch condition"]; - } + 34 [label="Enter when"]; subgraph cluster_12 { color=blue - 40 [label="Enter when branch condition else"]; + 35 [label="Enter when branch condition "]; + 36 [label="Access variable R|/b|"]; + 37 [label="Const: Boolean(true)"]; + 38 [label="Operator =="]; + 39 [label="Const: Boolean(true)"]; + 40 [label="Operator !="]; 41 [label="Exit when branch condition"]; } - 42 [label="Enter when branch result"]; subgraph cluster_13 { color=blue - 43 [label="Enter block"]; - 44 [label="Access variable R|/b|"]; - 45 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 46 [label="Exit block"]; + 42 [label="Enter when branch condition else"]; + 43 [label="Exit when branch condition"]; } - 47 [label="Exit when branch result"]; - 48 [label="Enter when branch result"]; + 44 [label="Enter when branch result"]; subgraph cluster_14 { color=blue - 49 [label="Enter block"]; - 50 [label="Access variable R|/b|"]; - 51 [label="Function call: R|/b|.#()"]; - 52 [label="Exit block"]; + 45 [label="Enter block"]; + 46 [label="Access variable R|/b|"]; + 47 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 48 [label="Exit block"]; } - 53 [label="Exit when branch result"]; - 54 [label="Exit when"]; + 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"]; } - 55 [label="Exit function test_2" style="filled" fillcolor=red]; + 57 [label="Exit function test_2" style="filled" fillcolor=red]; } - 31 -> {32}; - 32 -> {33}; 33 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {48 40}; + 39 -> {40}; 40 -> {41}; - 41 -> {42}; + 41 -> {50 42}; 42 -> {43}; 43 -> {44}; 44 -> {45}; 45 -> {46}; 46 -> {47}; - 47 -> {54}; + 47 -> {48}; 48 -> {49}; - 49 -> {50}; + 49 -> {56}; 50 -> {51}; 51 -> {52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; + 55 -> {56}; + 56 -> {57}; - subgraph cluster_15 { + subgraph cluster_16 { color=red - 56 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_16 { + 58 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_17 { color=blue - 57 [label="Enter when"]; - subgraph cluster_17 { - color=blue - 58 [label="Enter when branch condition "]; - 59 [label="Access variable R|/b|"]; - 60 [label="Const: Boolean(true)"]; - 61 [label="Operator =="]; - 62 [label="Const: Boolean(false)"]; - 63 [label="Operator =="]; - 64 [label="Exit when branch condition"]; - } + 59 [label="Enter when"]; subgraph cluster_18 { color=blue - 65 [label="Enter when branch condition else"]; + 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)"]; + 65 [label="Operator =="]; 66 [label="Exit when branch condition"]; } - 67 [label="Enter when branch result"]; subgraph cluster_19 { color=blue - 68 [label="Enter block"]; - 69 [label="Access variable R|/b|"]; - 70 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 71 [label="Exit block"]; + 67 [label="Enter when branch condition else"]; + 68 [label="Exit when branch condition"]; } - 72 [label="Exit when branch result"]; - 73 [label="Enter when branch result"]; + 69 [label="Enter when branch result"]; subgraph cluster_20 { color=blue - 74 [label="Enter block"]; - 75 [label="Access variable R|/b|"]; - 76 [label="Function call: R|/b|.#()"]; - 77 [label="Exit block"]; + 70 [label="Enter block"]; + 71 [label="Access variable R|/b|"]; + 72 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 73 [label="Exit block"]; } - 78 [label="Exit when branch result"]; - 79 [label="Exit when"]; + 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"]; } - 80 [label="Exit function test_3" style="filled" fillcolor=red]; + 82 [label="Exit function test_3" style="filled" fillcolor=red]; } - 56 -> {57}; - 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {73 65}; + 64 -> {65}; 65 -> {66}; - 66 -> {67}; + 66 -> {75 67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; 70 -> {71}; 71 -> {72}; - 72 -> {79}; + 72 -> {73}; 73 -> {74}; - 74 -> {75}; + 74 -> {81}; 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; + 80 -> {81}; + 81 -> {82}; - subgraph cluster_21 { + subgraph cluster_22 { color=red - 81 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_22 { + 83 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_23 { color=blue - 82 [label="Enter when"]; - subgraph cluster_23 { - color=blue - 83 [label="Enter when branch condition "]; - 84 [label="Access variable R|/b|"]; - 85 [label="Const: Boolean(true)"]; - 86 [label="Operator =="]; - 87 [label="Const: Boolean(false)"]; - 88 [label="Operator !="]; - 89 [label="Exit when branch condition"]; - } + 84 [label="Enter when"]; subgraph cluster_24 { color=blue - 90 [label="Enter when branch condition else"]; + 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"]; } - 92 [label="Enter when branch result"]; subgraph cluster_25 { color=blue - 93 [label="Enter block"]; - 94 [label="Access variable R|/b|"]; - 95 [label="Function call: R|/b|.#()"]; - 96 [label="Exit block"]; + 92 [label="Enter when branch condition else"]; + 93 [label="Exit when branch condition"]; } - 97 [label="Exit when branch result"]; - 98 [label="Enter when branch result"]; + 94 [label="Enter when branch result"]; subgraph cluster_26 { color=blue - 99 [label="Enter block"]; - 100 [label="Access variable R|/b|"]; - 101 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 102 [label="Exit block"]; + 95 [label="Enter block"]; + 96 [label="Access variable R|/b|"]; + 97 [label="Function call: R|/b|.#()"]; + 98 [label="Exit block"]; } - 103 [label="Exit when branch result"]; - 104 [label="Exit when"]; + 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"]; } - 105 [label="Exit function test_4" style="filled" fillcolor=red]; + 107 [label="Exit function test_4" style="filled" fillcolor=red]; } - 81 -> {82}; - 82 -> {83}; 83 -> {84}; 84 -> {85}; 85 -> {86}; 86 -> {87}; 87 -> {88}; 88 -> {89}; - 89 -> {98 90}; + 89 -> {90}; 90 -> {91}; - 91 -> {92}; + 91 -> {100 92}; 92 -> {93}; 93 -> {94}; 94 -> {95}; 95 -> {96}; 96 -> {97}; - 97 -> {104}; + 97 -> {98}; 98 -> {99}; - 99 -> {100}; + 99 -> {106}; 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; + 105 -> {106}; + 106 -> {107}; - subgraph cluster_27 { + subgraph cluster_28 { color=red - 106 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_28 { + 108 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_29 { color=blue - 107 [label="Enter when"]; - subgraph cluster_29 { - color=blue - 108 [label="Enter when branch condition "]; - 109 [label="Access variable R|/b|"]; - 110 [label="Const: Boolean(true)"]; - 111 [label="Operator !="]; - 112 [label="Const: Boolean(true)"]; - 113 [label="Operator =="]; - 114 [label="Exit when branch condition"]; - } + 109 [label="Enter when"]; subgraph cluster_30 { color=blue - 115 [label="Enter when branch condition else"]; + 110 [label="Enter when branch condition "]; + 111 [label="Access variable R|/b|"]; + 112 [label="Const: Boolean(true)"]; + 113 [label="Operator !="]; + 114 [label="Const: Boolean(true)"]; + 115 [label="Operator =="]; 116 [label="Exit when branch condition"]; } - 117 [label="Enter when branch result"]; subgraph cluster_31 { color=blue - 118 [label="Enter block"]; - 119 [label="Access variable R|/b|"]; - 120 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 121 [label="Exit block"]; + 117 [label="Enter when branch condition else"]; + 118 [label="Exit when branch condition"]; } - 122 [label="Exit when branch result"]; - 123 [label="Enter when branch result"]; + 119 [label="Enter when branch result"]; subgraph cluster_32 { color=blue - 124 [label="Enter block"]; - 125 [label="Access variable R|/b|"]; - 126 [label="Function call: R|/b|.#()"]; - 127 [label="Exit block"]; + 120 [label="Enter block"]; + 121 [label="Access variable R|/b|"]; + 122 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 123 [label="Exit block"]; } - 128 [label="Exit when branch result"]; - 129 [label="Exit when"]; + 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"]; } - 130 [label="Exit function test_5" style="filled" fillcolor=red]; + 132 [label="Exit function test_5" style="filled" fillcolor=red]; } - 106 -> {107}; - 107 -> {108}; 108 -> {109}; 109 -> {110}; 110 -> {111}; 111 -> {112}; 112 -> {113}; 113 -> {114}; - 114 -> {123 115}; + 114 -> {115}; 115 -> {116}; - 116 -> {117}; + 116 -> {125 117}; 117 -> {118}; 118 -> {119}; 119 -> {120}; 120 -> {121}; 121 -> {122}; - 122 -> {129}; + 122 -> {123}; 123 -> {124}; - 124 -> {125}; + 124 -> {131}; 125 -> {126}; 126 -> {127}; 127 -> {128}; 128 -> {129}; 129 -> {130}; + 130 -> {131}; + 131 -> {132}; - subgraph cluster_33 { + subgraph cluster_34 { color=red - 131 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_34 { + 133 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_35 { color=blue - 132 [label="Enter when"]; - subgraph cluster_35 { - color=blue - 133 [label="Enter when branch condition "]; - 134 [label="Access variable R|/b|"]; - 135 [label="Const: Boolean(true)"]; - 136 [label="Operator !="]; - 137 [label="Const: Boolean(true)"]; - 138 [label="Operator !="]; - 139 [label="Exit when branch condition"]; - } + 134 [label="Enter when"]; subgraph cluster_36 { color=blue - 140 [label="Enter when branch condition else"]; + 135 [label="Enter when branch condition "]; + 136 [label="Access variable R|/b|"]; + 137 [label="Const: Boolean(true)"]; + 138 [label="Operator !="]; + 139 [label="Const: Boolean(true)"]; + 140 [label="Operator !="]; 141 [label="Exit when branch condition"]; } - 142 [label="Enter when branch result"]; subgraph cluster_37 { color=blue - 143 [label="Enter block"]; - 144 [label="Access variable R|/b|"]; - 145 [label="Function call: R|/b|.#()"]; - 146 [label="Exit block"]; + 142 [label="Enter when branch condition else"]; + 143 [label="Exit when branch condition"]; } - 147 [label="Exit when branch result"]; - 148 [label="Enter when branch result"]; + 144 [label="Enter when branch result"]; subgraph cluster_38 { color=blue - 149 [label="Enter block"]; - 150 [label="Access variable R|/b|"]; - 151 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 152 [label="Exit block"]; + 145 [label="Enter block"]; + 146 [label="Access variable R|/b|"]; + 147 [label="Function call: R|/b|.#()"]; + 148 [label="Exit block"]; } - 153 [label="Exit when branch result"]; - 154 [label="Exit when"]; + 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"]; } - 155 [label="Exit function test_6" style="filled" fillcolor=red]; + 157 [label="Exit function test_6" style="filled" fillcolor=red]; } - 131 -> {132}; - 132 -> {133}; 133 -> {134}; 134 -> {135}; 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; - 139 -> {148 140}; + 139 -> {140}; 140 -> {141}; - 141 -> {142}; + 141 -> {150 142}; 142 -> {143}; 143 -> {144}; 144 -> {145}; 145 -> {146}; 146 -> {147}; - 147 -> {154}; + 147 -> {148}; 148 -> {149}; - 149 -> {150}; + 149 -> {156}; 150 -> {151}; 151 -> {152}; 152 -> {153}; 153 -> {154}; 154 -> {155}; + 155 -> {156}; + 156 -> {157}; - subgraph cluster_39 { + subgraph cluster_40 { color=red - 156 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_40 { + 158 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_41 { color=blue - 157 [label="Enter when"]; - subgraph cluster_41 { - color=blue - 158 [label="Enter when branch condition "]; - 159 [label="Access variable R|/b|"]; - 160 [label="Const: Boolean(true)"]; - 161 [label="Operator !="]; - 162 [label="Const: Boolean(false)"]; - 163 [label="Operator =="]; - 164 [label="Exit when branch condition"]; - } + 159 [label="Enter when"]; subgraph cluster_42 { color=blue - 165 [label="Enter when branch condition else"]; + 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"]; } - 167 [label="Enter when branch result"]; subgraph cluster_43 { color=blue - 168 [label="Enter block"]; - 169 [label="Access variable R|/b|"]; - 170 [label="Function call: R|/b|.#()"]; - 171 [label="Exit block"]; + 167 [label="Enter when branch condition else"]; + 168 [label="Exit when branch condition"]; } - 172 [label="Exit when branch result"]; - 173 [label="Enter when branch result"]; + 169 [label="Enter when branch result"]; subgraph cluster_44 { color=blue - 174 [label="Enter block"]; - 175 [label="Access variable R|/b|"]; - 176 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 177 [label="Exit block"]; + 170 [label="Enter block"]; + 171 [label="Access variable R|/b|"]; + 172 [label="Function call: R|/b|.#()"]; + 173 [label="Exit block"]; } - 178 [label="Exit when branch result"]; - 179 [label="Exit when"]; + 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"]; } - 180 [label="Exit function test_7" style="filled" fillcolor=red]; + 182 [label="Exit function test_7" style="filled" fillcolor=red]; } - 156 -> {157}; - 157 -> {158}; 158 -> {159}; 159 -> {160}; 160 -> {161}; 161 -> {162}; 162 -> {163}; 163 -> {164}; - 164 -> {173 165}; + 164 -> {165}; 165 -> {166}; - 166 -> {167}; + 166 -> {175 167}; 167 -> {168}; 168 -> {169}; 169 -> {170}; 170 -> {171}; 171 -> {172}; - 172 -> {179}; + 172 -> {173}; 173 -> {174}; - 174 -> {175}; + 174 -> {181}; 175 -> {176}; 176 -> {177}; 177 -> {178}; 178 -> {179}; 179 -> {180}; + 180 -> {181}; + 181 -> {182}; - subgraph cluster_45 { + subgraph cluster_46 { color=red - 181 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_46 { + 183 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_47 { color=blue - 182 [label="Enter when"]; - subgraph cluster_47 { - color=blue - 183 [label="Enter when branch condition "]; - 184 [label="Access variable R|/b|"]; - 185 [label="Const: Boolean(true)"]; - 186 [label="Operator !="]; - 187 [label="Const: Boolean(false)"]; - 188 [label="Operator !="]; - 189 [label="Exit when branch condition"]; - } + 184 [label="Enter when"]; subgraph cluster_48 { color=blue - 190 [label="Enter when branch condition else"]; + 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)"]; + 190 [label="Operator !="]; 191 [label="Exit when branch condition"]; } - 192 [label="Enter when branch result"]; subgraph cluster_49 { color=blue - 193 [label="Enter block"]; - 194 [label="Access variable R|/b|"]; - 195 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 196 [label="Exit block"]; + 192 [label="Enter when branch condition else"]; + 193 [label="Exit when branch condition"]; } - 197 [label="Exit when branch result"]; - 198 [label="Enter when branch result"]; + 194 [label="Enter when branch result"]; subgraph cluster_50 { color=blue - 199 [label="Enter block"]; - 200 [label="Access variable R|/b|"]; - 201 [label="Function call: R|/b|.#()"]; - 202 [label="Exit block"]; + 195 [label="Enter block"]; + 196 [label="Access variable R|/b|"]; + 197 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 198 [label="Exit block"]; } - 203 [label="Exit when branch result"]; - 204 [label="Exit when"]; + 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"]; } - 205 [label="Exit function test_8" style="filled" fillcolor=red]; + 207 [label="Exit function test_8" style="filled" fillcolor=red]; } - 181 -> {182}; - 182 -> {183}; 183 -> {184}; 184 -> {185}; 185 -> {186}; 186 -> {187}; 187 -> {188}; 188 -> {189}; - 189 -> {198 190}; + 189 -> {190}; 190 -> {191}; - 191 -> {192}; + 191 -> {200 192}; 192 -> {193}; 193 -> {194}; 194 -> {195}; 195 -> {196}; 196 -> {197}; - 197 -> {204}; + 197 -> {198}; 198 -> {199}; - 199 -> {200}; + 199 -> {206}; 200 -> {201}; 201 -> {202}; 202 -> {203}; 203 -> {204}; 204 -> {205}; + 205 -> {206}; + 206 -> {207}; } 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 ba471301a16..a5226eb270d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot @@ -13,135 +13,141 @@ digraph jumpFromRhsOfOperator_kt { subgraph cluster_1 { color=red - 2 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 3 [label="Enter ||"]; - 4 [label="Access variable R|/a|"]; - 5 [label="Const: Null(null)"]; - 6 [label="Operator !="]; - 7 [label="Exit left part of ||"]; - 8 [label="Enter right part of ||"]; - 9 [label="Function call: R|java/lang/Exception.Exception|()"]; - 10 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 11 [label="Stub" style="filled" fillcolor=gray]; - 12 [label="Exit ||"]; - } - 13 [label="Access variable R|/a|"]; - 14 [label="Function call: R|/a|.R|/A.foo|()"]; - 15 [label="Exit function test_1" style="filled" fillcolor=red]; + 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_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 ||"]; + } + 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]; } - 2 -> {3}; - 3 -> {4}; 4 -> {5}; 5 -> {6}; 6 -> {7}; - 7 -> {12 8}; + 7 -> {8}; 8 -> {9}; - 9 -> {10}; - 10 -> {15}; - 10 -> {11} [style=dotted]; - 11 -> {12} [style=dotted]; - 12 -> {13}; - 13 -> {14}; + 9 -> {14 10}; + 10 -> {11}; + 11 -> {12}; + 12 -> {17}; + 12 -> {13} [style=dotted]; + 13 -> {14} [style=dotted]; 14 -> {15}; + 15 -> {16}; + 16 -> {17}; - subgraph cluster_3 { + subgraph cluster_4 { color=red - 16 [label="Enter function teat_2" style="filled" fillcolor=red]; - subgraph cluster_4 { + 18 [label="Enter function teat_2" style="filled" fillcolor=red]; + subgraph cluster_5 { color=blue - 17 [label="Enter &&"]; - 18 [label="Access variable R|/a|"]; - 19 [label="Const: Null(null)"]; - 20 [label="Operator =="]; - 21 [label="Exit left part of &&"]; - 22 [label="Enter right part of &&"]; - 23 [label="Function call: R|java/lang/Exception.Exception|()"]; - 24 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 25 [label="Stub" style="filled" fillcolor=gray]; - 26 [label="Exit &&"]; + 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 &&"]; } - 27 [label="Access variable R|/a|"]; - 28 [label="Function call: R|/a|.R|/A.foo|()"]; - 29 [label="Exit function teat_2" style="filled" fillcolor=red]; + 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]; } - 16 -> {17}; - 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {26 22}; + 21 -> {22}; 22 -> {23}; - 23 -> {24}; - 24 -> {29}; - 24 -> {25} [style=dotted]; - 25 -> {26} [style=dotted]; - 26 -> {27}; - 27 -> {28}; + 23 -> {28 24}; + 24 -> {25}; + 25 -> {26}; + 26 -> {31}; + 26 -> {27} [style=dotted]; + 27 -> {28} [style=dotted]; 28 -> {29}; + 29 -> {30}; + 30 -> {31}; - subgraph cluster_5 { + subgraph cluster_6 { color=red - 30 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_6 { + 32 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_7 { color=blue - 31 [label="Enter when"]; - subgraph cluster_7 { + 33 [label="Enter when"]; + subgraph cluster_8 { color=blue - 32 [label="Enter when branch condition "]; - subgraph cluster_8 { + 34 [label="Enter when branch condition "]; + subgraph cluster_9 { color=blue - 33 [label="Enter ||"]; - 34 [label="Access variable R|/a|"]; - 35 [label="Const: Null(null)"]; - 36 [label="Operator !="]; - 37 [label="Exit left part of ||"]; - 38 [label="Enter right part of ||"]; - 39 [label="Function call: R|java/lang/Exception.Exception|()"]; - 40 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 41 [label="Stub" style="filled" fillcolor=gray]; - 42 [label="Exit ||"]; + 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 ||"]; } - 43 [label="Exit when branch condition"]; + 45 [label="Exit when branch condition"]; } - 44 [label="Synthetic else branch"]; - 45 [label="Enter when branch result"]; - subgraph cluster_9 { + 46 [label="Synthetic else branch"]; + 47 [label="Enter when branch result"]; + subgraph cluster_10 { color=blue - 46 [label="Enter block"]; - 47 [label="Access variable R|/a|"]; - 48 [label="Function call: R|/a|.R|/A.foo|()"]; - 49 [label="Exit block"]; + 48 [label="Enter block"]; + 49 [label="Access variable R|/a|"]; + 50 [label="Function call: R|/a|.R|/A.foo|()"]; + 51 [label="Exit block"]; } - 50 [label="Exit when branch result"]; - 51 [label="Exit when"]; + 52 [label="Exit when branch result"]; + 53 [label="Exit when"]; } - 52 [label="Access variable R|/a|"]; - 53 [label="Function call: R|/a|.R|/A.foo|()"]; - 54 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - 30 -> {31}; - 31 -> {32}; 32 -> {33}; 33 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {42 38}; + 37 -> {38}; 38 -> {39}; - 39 -> {40}; - 40 -> {54}; - 40 -> {41} [style=dotted]; - 41 -> {42} [style=dotted]; - 42 -> {43}; - 43 -> {45 44}; - 44 -> {51}; - 45 -> {46}; - 46 -> {47}; + 39 -> {44 40}; + 40 -> {41}; + 41 -> {42}; + 42 -> {56}; + 42 -> {43} [style=dotted]; + 43 -> {44} [style=dotted]; + 44 -> {45}; + 45 -> {47 46}; + 46 -> {53}; 47 -> {48}; 48 -> {49}; 49 -> {50}; @@ -149,66 +155,66 @@ digraph jumpFromRhsOfOperator_kt { 51 -> {52}; 52 -> {53}; 53 -> {54}; + 54 -> {55}; + 55 -> {56}; - subgraph cluster_10 { + subgraph cluster_11 { color=red - 55 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_11 { + 57 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_12 { color=blue - 56 [label="Enter when"]; - subgraph cluster_12 { + 58 [label="Enter when"]; + subgraph cluster_13 { color=blue - 57 [label="Enter when branch condition "]; - subgraph cluster_13 { + 59 [label="Enter when branch condition "]; + subgraph cluster_14 { color=blue - 58 [label="Enter &&"]; - 59 [label="Access variable R|/a|"]; - 60 [label="Const: Null(null)"]; - 61 [label="Operator =="]; - 62 [label="Exit left part of &&"]; - 63 [label="Enter right part of &&"]; - 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]; - 67 [label="Exit &&"]; + 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 &&"]; } - 68 [label="Exit when branch condition"]; + 70 [label="Exit when branch condition"]; } - 69 [label="Synthetic else branch"]; - 70 [label="Enter when branch result"]; - subgraph cluster_14 { + 71 [label="Synthetic else branch"]; + 72 [label="Enter when branch result"]; + subgraph cluster_15 { color=blue - 71 [label="Enter block"]; - 72 [label="Access variable R|/a|"]; - 73 [label="Function call: R|/a|.R|/A.foo|()"]; - 74 [label="Exit block"]; + 73 [label="Enter block"]; + 74 [label="Access variable R|/a|"]; + 75 [label="Function call: R|/a|.R|/A.foo|()"]; + 76 [label="Exit block"]; } - 75 [label="Exit when branch result"]; - 76 [label="Exit when"]; + 77 [label="Exit when branch result"]; + 78 [label="Exit when"]; } - 77 [label="Access variable R|/a|"]; - 78 [label="Function call: R|/a|.R|/A.foo|()"]; - 79 [label="Exit function test_4" style="filled" fillcolor=red]; + 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]; } - 55 -> {56}; - 56 -> {57}; 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; - 62 -> {67 63}; + 62 -> {63}; 63 -> {64}; - 64 -> {65}; - 65 -> {79}; - 65 -> {66} [style=dotted]; - 66 -> {67} [style=dotted]; - 67 -> {68}; - 68 -> {70 69}; - 69 -> {76}; - 70 -> {71}; - 71 -> {72}; + 64 -> {69 65}; + 65 -> {66}; + 66 -> {67}; + 67 -> {81}; + 67 -> {68} [style=dotted]; + 68 -> {69} [style=dotted]; + 69 -> {70}; + 70 -> {72 71}; + 71 -> {78}; 72 -> {73}; 73 -> {74}; 74 -> {75}; @@ -216,138 +222,138 @@ digraph jumpFromRhsOfOperator_kt { 76 -> {77}; 77 -> {78}; 78 -> {79}; + 79 -> {80}; + 80 -> {81}; - subgraph cluster_15 { + subgraph cluster_16 { color=red - 80 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_16 { + 82 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_17 { color=blue - 81 [label="Enter ||"]; - 82 [label="Access variable R|/a|"]; - 83 [label="Const: Null(null)"]; - 84 [label="Operator =="]; - 85 [label="Exit left part of ||"]; - 86 [label="Enter right part of ||"]; - 87 [label="Function call: R|java/lang/Exception.Exception|()"]; - 88 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 89 [label="Stub" style="filled" fillcolor=gray]; - 90 [label="Exit ||"]; + 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 ||"]; } - 91 [label="Access variable R|/a|"]; - 92 [label="Function call: R|/a|.#()"]; - 93 [label="Exit function test_5" style="filled" fillcolor=red]; + 93 [label="Access variable R|/a|"]; + 94 [label="Function call: R|/a|.#()"]; + 95 [label="Exit function test_5" style="filled" fillcolor=red]; } - 80 -> {81}; - 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {90 86}; + 85 -> {86}; 86 -> {87}; - 87 -> {88}; - 88 -> {93}; - 88 -> {89} [style=dotted]; - 89 -> {90} [style=dotted]; - 90 -> {91}; - 91 -> {92}; + 87 -> {92 88}; + 88 -> {89}; + 89 -> {90}; + 90 -> {95}; + 90 -> {91} [style=dotted]; + 91 -> {92} [style=dotted]; 92 -> {93}; + 93 -> {94}; + 94 -> {95}; - subgraph cluster_17 { + subgraph cluster_18 { color=red - 94 [label="Enter function teat_6" style="filled" fillcolor=red]; - subgraph cluster_18 { + 96 [label="Enter function teat_6" style="filled" fillcolor=red]; + subgraph cluster_19 { color=blue - 95 [label="Enter &&"]; - 96 [label="Access variable R|/a|"]; - 97 [label="Const: Null(null)"]; - 98 [label="Operator !="]; - 99 [label="Exit left part of &&"]; - 100 [label="Enter right part of &&"]; - 101 [label="Function call: R|java/lang/Exception.Exception|()"]; - 102 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 103 [label="Stub" style="filled" fillcolor=gray]; - 104 [label="Exit &&"]; + 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 &&"]; } - 105 [label="Access variable R|/a|"]; - 106 [label="Function call: R|/a|.#()"]; - 107 [label="Exit function teat_6" style="filled" fillcolor=red]; + 107 [label="Access variable R|/a|"]; + 108 [label="Function call: R|/a|.#()"]; + 109 [label="Exit function teat_6" style="filled" fillcolor=red]; } - 94 -> {95}; - 95 -> {96}; 96 -> {97}; 97 -> {98}; 98 -> {99}; - 99 -> {104 100}; + 99 -> {100}; 100 -> {101}; - 101 -> {102}; - 102 -> {107}; - 102 -> {103} [style=dotted]; - 103 -> {104} [style=dotted]; - 104 -> {105}; - 105 -> {106}; + 101 -> {106 102}; + 102 -> {103}; + 103 -> {104}; + 104 -> {109}; + 104 -> {105} [style=dotted]; + 105 -> {106} [style=dotted]; 106 -> {107}; + 107 -> {108}; + 108 -> {109}; - subgraph cluster_19 { + subgraph cluster_20 { color=red - 108 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_20 { + 110 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_21 { color=blue - 109 [label="Enter when"]; - subgraph cluster_21 { + 111 [label="Enter when"]; + subgraph cluster_22 { color=blue - 110 [label="Enter when branch condition "]; - subgraph cluster_22 { + 112 [label="Enter when branch condition "]; + subgraph cluster_23 { color=blue - 111 [label="Enter ||"]; - 112 [label="Access variable R|/a|"]; - 113 [label="Const: Null(null)"]; - 114 [label="Operator =="]; - 115 [label="Exit left part of ||"]; - 116 [label="Enter right part of ||"]; - 117 [label="Function call: R|java/lang/Exception.Exception|()"]; - 118 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 119 [label="Stub" style="filled" fillcolor=gray]; - 120 [label="Exit ||"]; + 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 ||"]; } - 121 [label="Exit when branch condition"]; + 123 [label="Exit when branch condition"]; } - 122 [label="Synthetic else branch"]; - 123 [label="Enter when branch result"]; - subgraph cluster_23 { + 124 [label="Synthetic else branch"]; + 125 [label="Enter when branch result"]; + subgraph cluster_24 { color=blue - 124 [label="Enter block"]; - 125 [label="Access variable R|/a|"]; - 126 [label="Function call: R|/a|.#()"]; - 127 [label="Exit block"]; + 126 [label="Enter block"]; + 127 [label="Access variable R|/a|"]; + 128 [label="Function call: R|/a|.#()"]; + 129 [label="Exit block"]; } - 128 [label="Exit when branch result"]; - 129 [label="Exit when"]; + 130 [label="Exit when branch result"]; + 131 [label="Exit when"]; } - 130 [label="Access variable R|/a|"]; - 131 [label="Function call: R|/a|.#()"]; - 132 [label="Exit function test_7" style="filled" fillcolor=red]; + 132 [label="Access variable R|/a|"]; + 133 [label="Function call: R|/a|.#()"]; + 134 [label="Exit function test_7" style="filled" fillcolor=red]; } - 108 -> {109}; - 109 -> {110}; 110 -> {111}; 111 -> {112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; - 115 -> {120 116}; + 115 -> {116}; 116 -> {117}; - 117 -> {118}; - 118 -> {132}; - 118 -> {119} [style=dotted]; - 119 -> {120} [style=dotted]; - 120 -> {121}; - 121 -> {123 122}; - 122 -> {129}; - 123 -> {124}; - 124 -> {125}; + 117 -> {122 118}; + 118 -> {119}; + 119 -> {120}; + 120 -> {134}; + 120 -> {121} [style=dotted]; + 121 -> {122} [style=dotted]; + 122 -> {123}; + 123 -> {125 124}; + 124 -> {131}; 125 -> {126}; 126 -> {127}; 127 -> {128}; @@ -355,66 +361,66 @@ digraph jumpFromRhsOfOperator_kt { 129 -> {130}; 130 -> {131}; 131 -> {132}; + 132 -> {133}; + 133 -> {134}; - subgraph cluster_24 { + subgraph cluster_25 { color=red - 133 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_25 { + 135 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_26 { color=blue - 134 [label="Enter when"]; - subgraph cluster_26 { + 136 [label="Enter when"]; + subgraph cluster_27 { color=blue - 135 [label="Enter when branch condition "]; - subgraph cluster_27 { + 137 [label="Enter when branch condition "]; + subgraph cluster_28 { color=blue - 136 [label="Enter &&"]; - 137 [label="Access variable R|/a|"]; - 138 [label="Const: Null(null)"]; - 139 [label="Operator !="]; - 140 [label="Exit left part of &&"]; - 141 [label="Enter right part of &&"]; - 142 [label="Function call: R|java/lang/Exception.Exception|()"]; - 143 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 144 [label="Stub" style="filled" fillcolor=gray]; - 145 [label="Exit &&"]; + 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 &&"]; } - 146 [label="Exit when branch condition"]; + 148 [label="Exit when branch condition"]; } - 147 [label="Synthetic else branch"]; - 148 [label="Enter when branch result"]; - subgraph cluster_28 { + 149 [label="Synthetic else branch"]; + 150 [label="Enter when branch result"]; + subgraph cluster_29 { color=blue - 149 [label="Enter block"]; - 150 [label="Access variable R|/a|"]; - 151 [label="Function call: R|/a|.#()"]; - 152 [label="Exit block"]; + 151 [label="Enter block"]; + 152 [label="Access variable R|/a|"]; + 153 [label="Function call: R|/a|.#()"]; + 154 [label="Exit block"]; } - 153 [label="Exit when branch result"]; - 154 [label="Exit when"]; + 155 [label="Exit when branch result"]; + 156 [label="Exit when"]; } - 155 [label="Access variable R|/a|"]; - 156 [label="Function call: R|/a|.#()"]; - 157 [label="Exit function test_8" style="filled" fillcolor=red]; + 157 [label="Access variable R|/a|"]; + 158 [label="Function call: R|/a|.#()"]; + 159 [label="Exit function test_8" style="filled" fillcolor=red]; } - 133 -> {134}; - 134 -> {135}; 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; 139 -> {140}; - 140 -> {145 141}; + 140 -> {141}; 141 -> {142}; - 142 -> {143}; - 143 -> {157}; - 143 -> {144} [style=dotted]; - 144 -> {145} [style=dotted]; - 145 -> {146}; - 146 -> {148 147}; - 147 -> {154}; - 148 -> {149}; - 149 -> {150}; + 142 -> {147 143}; + 143 -> {144}; + 144 -> {145}; + 145 -> {159}; + 145 -> {146} [style=dotted]; + 146 -> {147} [style=dotted]; + 147 -> {148}; + 148 -> {150 149}; + 149 -> {156}; 150 -> {151}; 151 -> {152}; 152 -> {153}; @@ -422,5 +428,7 @@ digraph jumpFromRhsOfOperator_kt { 154 -> {155}; 155 -> {156}; 156 -> {157}; + 157 -> {158}; + 158 -> {159}; } 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 cffedd8dcb7..0f2d880ad42 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot @@ -13,183 +13,195 @@ digraph boundSmartcasts_kt { subgraph cluster_1 { color=red - 2 [label="Enter function bar" style="filled" fillcolor=red]; - 3 [label="Exit function bar" style="filled" fillcolor=red]; + 2 [label="Enter class A" style="filled" fillcolor=red]; + 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3}; + 2 -> {3} [color=green]; subgraph cluster_2 { color=red - 4 [label="Enter function test_1" style="filled" fillcolor=red]; - 5 [label="Access variable R|/x|"]; - 6 [label="Variable declaration: lval y: R|kotlin/Any|"]; - subgraph cluster_3 { - color=blue - 7 [label="Enter when"]; - subgraph cluster_4 { - color=blue - 8 [label="Enter when branch condition "]; - 9 [label="Access variable R|/x|"]; - 10 [label="Type operator: (R|/x| is R|A|)"]; - 11 [label="Exit when branch condition"]; - } - 12 [label="Synthetic else branch"]; - 13 [label="Enter when branch result"]; - subgraph cluster_5 { - color=blue - 14 [label="Enter block"]; - 15 [label="Access variable R|/x|"]; - 16 [label="Function call: R|/x|.R|/A.foo|()"]; - 17 [label="Access variable R|/y|"]; - 18 [label="Function call: R|/y|.R|/A.foo|()"]; - 19 [label="Exit block"]; - } - 20 [label="Exit when branch result"]; - 21 [label="Exit when"]; - } - 22 [label="Exit function test_1" style="filled" fillcolor=red]; + 4 [label="Enter function bar" style="filled" fillcolor=red]; + 5 [label="Exit function bar" style="filled" fillcolor=red]; } 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; + + subgraph cluster_3 { + color=red + 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|"]; + subgraph cluster_5 { + color=blue + 11 [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"]; + } + 16 [label="Synthetic else branch"]; + 17 [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"]; + } + 24 [label="Exit when branch result"]; + 25 [label="Exit when"]; + } + 26 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 8 -> {9}; 9 -> {10}; 10 -> {11}; - 11 -> {13 12}; - 12 -> {21}; + 11 -> {12}; + 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {16}; - 16 -> {17}; + 15 -> {17 16}; + 16 -> {25}; 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; - - subgraph cluster_6 { - color=red - 23 [label="Enter function test_2" style="filled" fillcolor=red]; - 24 [label="Access variable R|/x|"]; - 25 [label="Variable declaration: lval y: R|kotlin/Any|"]; - subgraph cluster_7 { - color=blue - 26 [label="Enter when"]; - subgraph cluster_8 { - color=blue - 27 [label="Enter when branch condition "]; - 28 [label="Access variable R|/y|"]; - 29 [label="Type operator: (R|/y| is R|A|)"]; - 30 [label="Exit when branch condition"]; - } - 31 [label="Synthetic else branch"]; - 32 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 33 [label="Enter block"]; - 34 [label="Access variable R|/x|"]; - 35 [label="Function call: R|/x|.R|/A.foo|()"]; - 36 [label="Access variable R|/y|"]; - 37 [label="Function call: R|/y|.R|/A.foo|()"]; - 38 [label="Exit block"]; - } - 39 [label="Exit when branch result"]; - 40 [label="Exit when"]; - } - 41 [label="Exit function test_2" style="filled" fillcolor=red]; - } - + 22 -> {23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; - 26 -> {27}; + + 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|"]; + subgraph cluster_9 { + color=blue + 30 [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"]; + } + 35 [label="Synthetic else branch"]; + 36 [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"]; + } + 43 [label="Exit when branch result"]; + 44 [label="Exit when"]; + } + 45 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {32 31}; - 31 -> {40}; + 30 -> {31}; + 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {35}; - 35 -> {36}; + 34 -> {36 35}; + 35 -> {44}; 36 -> {37}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; - - subgraph cluster_10 { - color=red - 42 [label="Enter function test_3" style="filled" fillcolor=red]; - 43 [label="Access variable R|/x|"]; - 44 [label="Variable declaration: lvar z: R|kotlin/Any|"]; - subgraph cluster_11 { - color=blue - 45 [label="Enter when"]; - subgraph cluster_12 { - color=blue - 46 [label="Enter when branch condition "]; - 47 [label="Access variable R|/x|"]; - 48 [label="Type operator: (R|/x| is R|A|)"]; - 49 [label="Exit when branch condition"]; - } - 50 [label="Synthetic else branch"]; - 51 [label="Enter when branch result"]; - subgraph cluster_13 { - color=blue - 52 [label="Enter block"]; - 53 [label="Access variable R|/z|"]; - 54 [label="Function call: R|/z|.R|/A.foo|()"]; - 55 [label="Exit block"]; - } - 56 [label="Exit when branch result"]; - 57 [label="Exit when"]; - } - 58 [label="Access variable R|/y|"]; - 59 [label="Assignmenet: R|/z|"]; - subgraph cluster_14 { - color=blue - 60 [label="Enter when"]; - subgraph cluster_15 { - color=blue - 61 [label="Enter when branch condition "]; - 62 [label="Access variable R|/y|"]; - 63 [label="Type operator: (R|/y| is R|B|)"]; - 64 [label="Exit when branch condition"]; - } - 65 [label="Synthetic else branch"]; - 66 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 67 [label="Enter block"]; - 68 [label="Access variable R|/z|"]; - 69 [label="Function call: R|/z|.#()"]; - 70 [label="Access variable R|/z|"]; - 71 [label="Function call: R|/z|.R|/B.bar|()"]; - 72 [label="Exit block"]; - } - 73 [label="Exit when branch result"]; - 74 [label="Exit when"]; - } - 75 [label="Exit function test_3" style="filled" fillcolor=red]; - } - + 41 -> {42}; 42 -> {43}; 43 -> {44}; 44 -> {45}; - 45 -> {46}; + + 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|"]; + subgraph cluster_13 { + color=blue + 49 [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"]; + } + 54 [label="Synthetic else branch"]; + 55 [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"]; + } + 60 [label="Exit when branch result"]; + 61 [label="Exit when"]; + } + 62 [label="Access variable R|/y|"]; + 63 [label="Assignmenet: R|/z|"]; + subgraph cluster_16 { + color=blue + 64 [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"]; + } + 69 [label="Synthetic else branch"]; + 70 [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"]; + } + 77 [label="Exit when branch result"]; + 78 [label="Exit when"]; + } + 79 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 46 -> {47}; 47 -> {48}; 48 -> {49}; - 49 -> {51 50}; - 50 -> {57}; + 49 -> {50}; + 50 -> {51}; 51 -> {52}; 52 -> {53}; - 53 -> {54}; - 54 -> {55}; + 53 -> {55 54}; + 54 -> {61}; 55 -> {56}; 56 -> {57}; 57 -> {58}; @@ -199,62 +211,62 @@ digraph boundSmartcasts_kt { 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {66 65}; - 65 -> {74}; + 64 -> {65}; + 65 -> {66}; 66 -> {67}; 67 -> {68}; - 68 -> {69}; - 69 -> {70}; + 68 -> {70 69}; + 69 -> {78}; 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; - - subgraph cluster_17 { - color=red - 76 [label="Enter function test_4" style="filled" fillcolor=red]; - 77 [label="Const: Int(1)"]; - 78 [label="Variable declaration: lvar x: R|kotlin/Any|"]; - 79 [label="Access variable R|/x|"]; - 80 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 81 [label="Access variable R|/x|"]; - 82 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 83 [label="Access variable R|/y|"]; - 84 [label="Assignmenet: R|/x|"]; - 85 [label="Access variable R|/x|"]; - 86 [label="Function call: R|/x|.#()"]; - subgraph cluster_18 { - color=blue - 87 [label="Enter when"]; - subgraph cluster_19 { - color=blue - 88 [label="Enter when branch condition "]; - 89 [label="Access variable R|/y|"]; - 90 [label="Type operator: (R|/y| is R|A|)"]; - 91 [label="Exit when branch condition"]; - } - 92 [label="Synthetic else branch"]; - 93 [label="Enter when branch result"]; - subgraph cluster_20 { - color=blue - 94 [label="Enter block"]; - 95 [label="Access variable R|/x|"]; - 96 [label="Function call: R|/x|.R|/A.foo|()"]; - 97 [label="Access variable R|/y|"]; - 98 [label="Function call: R|/y|.R|/A.foo|()"]; - 99 [label="Exit block"]; - } - 100 [label="Exit when branch result"]; - 101 [label="Exit when"]; - } - 102 [label="Exit function test_4" style="filled" fillcolor=red]; - } - + 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; - 79 -> {80}; + + 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|.#()"]; + subgraph cluster_20 { + color=blue + 91 [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"]; + } + 96 [label="Synthetic else branch"]; + 97 [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"]; + } + 104 [label="Exit when branch result"]; + 105 [label="Exit when"]; + } + 106 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 80 -> {81}; 81 -> {82}; 82 -> {83}; @@ -266,167 +278,172 @@ digraph boundSmartcasts_kt { 88 -> {89}; 89 -> {90}; 90 -> {91}; - 91 -> {93 92}; - 92 -> {101}; + 91 -> {92}; + 92 -> {93}; 93 -> {94}; 94 -> {95}; - 95 -> {96}; - 96 -> {97}; + 95 -> {97 96}; + 96 -> {105}; 97 -> {98}; 98 -> {99}; 99 -> {100}; 100 -> {101}; 101 -> {102}; - - subgraph cluster_21 { - color=red - 103 [label="Enter function " style="filled" fillcolor=red]; - 104 [label="Delegated constructor call: super()"]; - 105 [label="Exit function " style="filled" fillcolor=red]; - } - + 102 -> {103}; 103 -> {104}; 104 -> {105}; - - subgraph cluster_22 { - color=red - 106 [label="Enter function getter" style="filled" fillcolor=red]; - 107 [label="Exit function getter" style="filled" fillcolor=red]; - } - - 106 -> {107}; + 105 -> {106}; subgraph cluster_23 { color=red - 108 [label="Enter property" style="filled" fillcolor=red]; - 109 [label="Access variable R|/any|"]; - 110 [label="Exit property" style="filled" fillcolor=red]; + 107 [label="Enter function " style="filled" fillcolor=red]; + 108 [label="Delegated constructor call: super()"]; + 109 [label="Exit function " style="filled" fillcolor=red]; } + 107 -> {108}; 108 -> {109}; - 109 -> {110}; subgraph cluster_24 { color=red - 111 [label="Enter function baz" style="filled" fillcolor=red]; - 112 [label="Exit function baz" style="filled" fillcolor=red]; + 110 [label="Enter function getter" style="filled" fillcolor=red]; + 111 [label="Exit function getter" style="filled" fillcolor=red]; } - 111 -> {112}; + 110 -> {111}; subgraph cluster_25 { color=red - 113 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_26 { - color=blue - 114 [label="Enter when"]; - 115 [label="Access variable R|/d|"]; - 116 [label="Access variable R|/D.any|"]; - 117 [label="Variable declaration: lval : R|kotlin/Any?|"]; - subgraph cluster_27 { - color=blue - 118 [label="Enter when branch condition "]; - 119 [label="Const: Null(null)"]; - 120 [label="Operator =="]; - 121 [label="Exit when branch condition"]; - } - subgraph cluster_28 { - color=blue - 122 [label="Enter when branch condition else"]; - 123 [label="Exit when branch condition"]; - } - 124 [label="Enter when branch result"]; - subgraph cluster_29 { - color=blue - 125 [label="Enter block"]; - 126 [label="Access variable R|/|"]; - 127 [label="Exit block"]; - } - 128 [label="Exit when branch result"]; - 129 [label="Enter when branch result"]; - subgraph cluster_30 { - color=blue - 130 [label="Enter block"]; - 131 [label="Jump: ^test_5 Unit"]; - 132 [label="Stub" style="filled" fillcolor=gray]; - 133 [label="Exit block" style="filled" fillcolor=gray]; - } - 134 [label="Exit when branch result" style="filled" fillcolor=gray]; - 135 [label="Exit when"]; - } - 136 [label="Variable declaration: lval a: R|kotlin/Any|"]; - 137 [label="Access variable R|/a|"]; - 138 [label="Function call: R|/a|.R|/baz|()"]; - 139 [label="Access variable R|/d|"]; - 140 [label="Access variable R|/D.any|"]; - 141 [label="Function call: R|/d|.R|/D.any|.R|/baz|()"]; - 142 [label="Access variable R|/a|"]; - 143 [label="Type operator: (R|/a| as R|A|)"]; - 144 [label="Access variable R|/a|"]; - 145 [label="Function call: R|/a|.R|/A.foo|()"]; - 146 [label="Exit function test_5" style="filled" fillcolor=red]; + 112 [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}; - 114 -> {115}; - 115 -> {116}; - 116 -> {117}; + + subgraph cluster_26 { + color=red + 115 [label="Enter class D" style="filled" fillcolor=red]; + 116 [label="Exit class D" style="filled" fillcolor=red]; + } + + + 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}; - 118 -> {119}; + + subgraph cluster_28 { + color=red + 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?|"]; + 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"]; + } + subgraph cluster_31 { + color=blue + 128 [label="Enter when branch condition else"]; + 129 [label="Exit when branch condition"]; + } + 130 [label="Enter when branch result"]; + subgraph cluster_32 { + color=blue + 131 [label="Enter block"]; + 132 [label="Access variable R|/|"]; + 133 [label="Exit block"]; + } + 134 [label="Exit when branch result"]; + 135 [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]; + } + 140 [label="Exit when branch result" style="filled" fillcolor=gray]; + 141 [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]; + } + 119 -> {120}; 120 -> {121}; - 121 -> {129 122}; + 121 -> {122}; 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; 126 -> {127}; - 127 -> {128}; - 128 -> {135}; + 127 -> {135 128}; + 128 -> {129}; 129 -> {130}; 130 -> {131}; - 131 -> {146}; - 131 -> {132} [style=dotted]; - 132 -> {133} [style=dotted]; - 133 -> {134} [style=dotted]; - 134 -> {135} [style=dotted]; + 131 -> {132}; + 132 -> {133}; + 133 -> {134}; + 134 -> {141}; 135 -> {136}; 136 -> {137}; - 137 -> {138}; - 138 -> {139}; - 139 -> {140}; - 140 -> {141}; + 137 -> {152}; + 137 -> {138} [style=dotted]; + 138 -> {139} [style=dotted]; + 139 -> {140} [style=dotted]; + 140 -> {141} [style=dotted]; 141 -> {142}; 142 -> {143}; 143 -> {144}; 144 -> {145}; 145 -> {146}; - - subgraph cluster_31 { - color=red - 147 [label="Enter function test_6" style="filled" fillcolor=red]; - 148 [label="Access variable R|/d1|"]; - 149 [label="Access variable R|/D.any|"]; - 150 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 151 [label="Access variable R|/a|"]; - 152 [label="Type operator: (R|/a| as R|A|)"]; - 153 [label="Access variable R|/a|"]; - 154 [label="Function call: R|/a|.R|/A.foo|()"]; - 155 [label="Access variable R|/d1|"]; - 156 [label="Access variable R|/D.any|"]; - 157 [label="Function call: R|/d1|.R|/D.any|.R|/A.foo|()"]; - 158 [label="Access variable R|/d1|"]; - 159 [label="Access variable R|/D.any|"]; - 160 [label="Function call: R|/d1|.R|/D.any|.R|/baz|()"]; - 161 [label="Exit function test_6" style="filled" fillcolor=red]; - } - + 146 -> {147}; 147 -> {148}; 148 -> {149}; 149 -> {150}; 150 -> {151}; 151 -> {152}; - 152 -> {153}; + + 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]; + } + 153 -> {154}; 154 -> {155}; 155 -> {156}; @@ -435,49 +452,55 @@ digraph boundSmartcasts_kt { 158 -> {159}; 159 -> {160}; 160 -> {161}; - - subgraph cluster_32 { - color=red - 162 [label="Enter function test_7" style="filled" fillcolor=red]; - 163 [label="Access variable R|/d1|"]; - 164 [label="Enter safe call"]; - 165 [label="Access variable R|/D.any|"]; - 166 [label="Exit safe call"]; - 167 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 168 [label="Access variable R|/d2|"]; - 169 [label="Enter safe call"]; - 170 [label="Access variable R|/D.any|"]; - 171 [label="Exit safe call"]; - 172 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - 173 [label="Access variable R|/a|"]; - 174 [label="Type operator: (R|/a| as R|A|)"]; - 175 [label="Access variable R|/a|"]; - 176 [label="Function call: R|/a|.R|/A.foo|()"]; - 177 [label="Access variable R|/b|"]; - 178 [label="Type operator: (R|/b| as R|B|)"]; - 179 [label="Access variable R|/b|"]; - 180 [label="Function call: R|/b|.R|/B.bar|()"]; - 181 [label="Exit function test_7" style="filled" fillcolor=red]; - } - + 161 -> {162}; 162 -> {163}; - 163 -> {164 166}; + 163 -> {164}; 164 -> {165}; 165 -> {166}; 166 -> {167}; - 167 -> {168}; - 168 -> {169 171}; - 169 -> {170}; + + 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|"]; + 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|"]; + 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]; + } + + 168 -> {169}; + 169 -> {170 172}; 170 -> {171}; 171 -> {172}; 172 -> {173}; 173 -> {174}; - 174 -> {175}; + 174 -> {175 177}; 175 -> {176}; 176 -> {177}; 177 -> {178}; 178 -> {179}; 179 -> {180}; 180 -> {181}; + 181 -> {182}; + 182 -> {183}; + 183 -> {184}; + 184 -> {185}; + 185 -> {186}; + 186 -> {187}; } 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 d04951f25aa..c185b2e3364 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot @@ -33,69 +33,74 @@ digraph boundSmartcastsInBranches_kt { subgraph cluster_3 { color=red - 8 [label="Enter function test_0" style="filled" fillcolor=red]; - 9 [label="Const: Null(null)"]; - 10 [label="Variable declaration: lvar goodA: R|A?|"]; - 11 [label="Access variable R|/list|"]; - 12 [label="Function call: R|/list|.R|FakeOverride|>|()"]; - 13 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; - subgraph cluster_4 { - color=blue - 14 [label="Enter while loop"]; - subgraph cluster_5 { - color=blue - 15 [label="Enter loop condition"]; - 16 [label="Access variable R|/|"]; - 17 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 18 [label="Exit loop condition"]; - } - subgraph cluster_6 { - color=blue - 19 [label="Enter loop block"]; - subgraph cluster_7 { - color=blue - 20 [label="Enter block"]; - 21 [label="Access variable R|/|"]; - 22 [label="Function call: R|/|.R|FakeOverride|()"]; - 23 [label="Variable declaration: lval a: R|A|"]; - subgraph cluster_8 { - color=blue - 24 [label="Enter when"]; - subgraph cluster_9 { - color=blue - 25 [label="Enter when branch condition "]; - 26 [label="Access variable R|/goodA|"]; - 27 [label="Const: Null(null)"]; - 28 [label="Operator =="]; - 29 [label="Exit when branch condition"]; - } - 30 [label="Synthetic else branch"]; - 31 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 32 [label="Enter block"]; - 33 [label="Access variable R|/a|"]; - 34 [label="Assignmenet: R|/goodA|"]; - 35 [label="Jump: continue@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] "]; - 36 [label="Stub" style="filled" fillcolor=gray]; - 37 [label="Exit block" style="filled" fillcolor=gray]; - } - 38 [label="Exit when branch result" style="filled" fillcolor=gray]; - 39 [label="Exit when"]; - } - 40 [label="Access variable R|/goodA|"]; - 41 [label="Access variable R|/A.s|"]; - 42 [label="Exit block"]; - } - 43 [label="Exit loop block"]; - } - 44 [label="Exit whileloop"]; - } - 45 [label="Exit function test_0" style="filled" fillcolor=red]; + 8 [label="Enter class A" style="filled" fillcolor=red]; + 9 [label="Exit class A" style="filled" fillcolor=red]; + } + + + 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|"]; + subgraph cluster_5 { + color=blue + 16 [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"]; + } + subgraph cluster_7 { + color=blue + 21 [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|"]; + subgraph cluster_9 { + color=blue + 26 [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"]; + } + 32 [label="Synthetic else branch"]; + 33 [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]; + } + 40 [label="Exit when branch result" style="filled" fillcolor=gray]; + 41 [label="Exit when"]; + } + 42 [label="Access variable R|/goodA|"]; + 43 [label="Access variable R|/A.s|"]; + 44 [label="Exit block"]; + } + 45 [label="Exit loop block"]; + } + 46 [label="Exit whileloop"]; + } + 47 [label="Exit function test_0" style="filled" fillcolor=red]; } - 8 -> {9}; - 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; @@ -104,9 +109,9 @@ digraph boundSmartcastsInBranches_kt { 15 -> {16}; 16 -> {17}; 17 -> {18}; - 18 -> {44 19}; + 18 -> {19}; 19 -> {20}; - 20 -> {21}; + 20 -> {46 21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; @@ -115,83 +120,83 @@ digraph boundSmartcastsInBranches_kt { 26 -> {27}; 27 -> {28}; 28 -> {29}; - 29 -> {31 30}; - 30 -> {39}; - 31 -> {32}; - 32 -> {33}; + 29 -> {30}; + 30 -> {31}; + 31 -> {33 32}; + 32 -> {41}; 33 -> {34}; 34 -> {35}; - 35 -> {14}; - 35 -> {36} [style=dotted]; - 36 -> {37} [style=dotted]; + 35 -> {36}; + 36 -> {37}; + 37 -> {16}; 37 -> {38} [style=dotted]; 38 -> {39} [style=dotted]; - 39 -> {40}; - 40 -> {41}; + 39 -> {40} [style=dotted]; + 40 -> {41} [style=dotted]; 41 -> {42}; 42 -> {43}; - 43 -> {15}; + 43 -> {44}; 44 -> {45}; + 45 -> {17}; + 46 -> {47}; - subgraph cluster_11 { + subgraph cluster_12 { color=red - 46 [label="Enter function test_1" style="filled" fillcolor=red]; - 47 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_12 { + 48 [label="Enter function test_1" style="filled" fillcolor=red]; + 49 [label="Variable declaration: lval x: R|kotlin/Any|"]; + subgraph cluster_13 { color=blue - 48 [label="Enter when"]; - subgraph cluster_13 { - color=blue - 49 [label="Enter when branch condition "]; - 50 [label="Access variable R|/b|"]; - 51 [label="Exit when branch condition"]; - } + 50 [label="Enter when"]; subgraph cluster_14 { color=blue - 52 [label="Enter when branch condition else"]; + 51 [label="Enter when branch condition "]; + 52 [label="Access variable R|/b|"]; 53 [label="Exit when branch condition"]; } - 54 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 55 [label="Enter block"]; - 56 [label="Access variable R|/a|"]; - 57 [label="Assignmenet: R|/x|"]; - 58 [label="Exit block"]; + 54 [label="Enter when branch condition else"]; + 55 [label="Exit when branch condition"]; } - 59 [label="Exit when branch result"]; - 60 [label="Enter when branch result"]; + 56 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 61 [label="Enter block"]; - 62 [label="Function call: R|/A.A|()"]; - 63 [label="Assignmenet: R|/x|"]; - 64 [label="Exit block"]; + 57 [label="Enter block"]; + 58 [label="Access variable R|/a|"]; + 59 [label="Assignmenet: R|/x|"]; + 60 [label="Exit block"]; } - 65 [label="Exit when branch result"]; - 66 [label="Exit when"]; + 61 [label="Exit when branch result"]; + 62 [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"]; + } + 67 [label="Exit when branch result"]; + 68 [label="Exit when"]; } - 67 [label="Access variable R|/x|"]; - 68 [label="Access variable R|/A.s|"]; - 69 [label="Exit function test_1" style="filled" fillcolor=red]; + 69 [label="Access variable R|/x|"]; + 70 [label="Access variable R|/A.s|"]; + 71 [label="Exit function test_1" style="filled" fillcolor=red]; } - 46 -> {47}; - 47 -> {48}; 48 -> {49}; 49 -> {50}; 50 -> {51}; - 51 -> {60 52}; + 51 -> {52}; 52 -> {53}; - 53 -> {54}; + 53 -> {62 54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; 57 -> {58}; 58 -> {59}; - 59 -> {66}; + 59 -> {60}; 60 -> {61}; - 61 -> {62}; + 61 -> {68}; 62 -> {63}; 63 -> {64}; 64 -> {65}; @@ -199,60 +204,60 @@ digraph boundSmartcastsInBranches_kt { 66 -> {67}; 67 -> {68}; 68 -> {69}; + 69 -> {70}; + 70 -> {71}; - subgraph cluster_17 { + subgraph cluster_18 { color=red - 70 [label="Enter function test_2" style="filled" fillcolor=red]; - 71 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_18 { + 72 [label="Enter function test_2" style="filled" fillcolor=red]; + 73 [label="Variable declaration: lval x: R|kotlin/Any|"]; + subgraph cluster_19 { color=blue - 72 [label="Enter when"]; - subgraph cluster_19 { - color=blue - 73 [label="Enter when branch condition "]; - 74 [label="Access variable R|/b|"]; - 75 [label="Exit when branch condition"]; - } + 74 [label="Enter when"]; subgraph cluster_20 { color=blue - 76 [label="Enter when branch condition else"]; + 75 [label="Enter when branch condition "]; + 76 [label="Access variable R|/b|"]; 77 [label="Exit when branch condition"]; } - 78 [label="Enter when branch result"]; subgraph cluster_21 { color=blue - 79 [label="Enter block"]; - 80 [label="Access variable R|/a|"]; - 81 [label="Assignmenet: R|/x|"]; - 82 [label="Access variable R|/a|"]; - 83 [label="Type operator: (R|/a| as R|A|)"]; - 84 [label="Exit block"]; + 78 [label="Enter when branch condition else"]; + 79 [label="Exit when branch condition"]; } - 85 [label="Exit when branch result"]; - 86 [label="Enter when branch result"]; + 80 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 87 [label="Enter block"]; - 88 [label="Function call: R|/A.A|()"]; - 89 [label="Assignmenet: R|/x|"]; - 90 [label="Exit block"]; + 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"]; } - 91 [label="Exit when branch result"]; - 92 [label="Exit when"]; + 87 [label="Exit when branch result"]; + 88 [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"]; + } + 93 [label="Exit when branch result"]; + 94 [label="Exit when"]; } - 93 [label="Access variable R|/x|"]; - 94 [label="Access variable R|/A.s|"]; - 95 [label="Exit function test_2" style="filled" fillcolor=red]; + 95 [label="Access variable R|/x|"]; + 96 [label="Access variable R|/A.s|"]; + 97 [label="Exit function test_2" style="filled" fillcolor=red]; } - 70 -> {71}; - 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; - 75 -> {86 76}; + 75 -> {76}; 76 -> {77}; - 77 -> {78}; + 77 -> {88 78}; 78 -> {79}; 79 -> {80}; 80 -> {81}; @@ -260,9 +265,9 @@ digraph boundSmartcastsInBranches_kt { 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {92}; + 85 -> {86}; 86 -> {87}; - 87 -> {88}; + 87 -> {94}; 88 -> {89}; 89 -> {90}; 90 -> {91}; @@ -270,60 +275,60 @@ digraph boundSmartcastsInBranches_kt { 92 -> {93}; 93 -> {94}; 94 -> {95}; + 95 -> {96}; + 96 -> {97}; - subgraph cluster_23 { + subgraph cluster_24 { color=red - 96 [label="Enter function test_3" style="filled" fillcolor=red]; - 97 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_24 { + 98 [label="Enter function test_3" style="filled" fillcolor=red]; + 99 [label="Variable declaration: lval x: R|kotlin/Any|"]; + subgraph cluster_25 { color=blue - 98 [label="Enter when"]; - subgraph cluster_25 { - color=blue - 99 [label="Enter when branch condition "]; - 100 [label="Access variable R|/b|"]; - 101 [label="Exit when branch condition"]; - } + 100 [label="Enter when"]; subgraph cluster_26 { color=blue - 102 [label="Enter when branch condition else"]; + 101 [label="Enter when branch condition "]; + 102 [label="Access variable R|/b|"]; 103 [label="Exit when branch condition"]; } - 104 [label="Enter when branch result"]; subgraph cluster_27 { color=blue - 105 [label="Enter block"]; - 106 [label="Access variable R|/a|"]; - 107 [label="Type operator: (R|/a| as R|A|)"]; - 108 [label="Access variable R|/a|"]; - 109 [label="Assignmenet: R|/x|"]; - 110 [label="Exit block"]; + 104 [label="Enter when branch condition else"]; + 105 [label="Exit when branch condition"]; } - 111 [label="Exit when branch result"]; - 112 [label="Enter when branch result"]; + 106 [label="Enter when branch result"]; subgraph cluster_28 { color=blue - 113 [label="Enter block"]; - 114 [label="Function call: R|/A.A|()"]; - 115 [label="Assignmenet: R|/x|"]; - 116 [label="Exit block"]; + 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"]; } - 117 [label="Exit when branch result"]; - 118 [label="Exit when"]; + 113 [label="Exit when branch result"]; + 114 [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"]; + } + 119 [label="Exit when branch result"]; + 120 [label="Exit when"]; } - 119 [label="Access variable R|/x|"]; - 120 [label="Access variable R|/A.s|"]; - 121 [label="Exit function test_3" style="filled" fillcolor=red]; + 121 [label="Access variable R|/x|"]; + 122 [label="Access variable R|/A.s|"]; + 123 [label="Exit function test_3" style="filled" fillcolor=red]; } - 96 -> {97}; - 97 -> {98}; 98 -> {99}; 99 -> {100}; 100 -> {101}; - 101 -> {112 102}; + 101 -> {102}; 102 -> {103}; - 103 -> {104}; + 103 -> {114 104}; 104 -> {105}; 105 -> {106}; 106 -> {107}; @@ -331,9 +336,9 @@ digraph boundSmartcastsInBranches_kt { 108 -> {109}; 109 -> {110}; 110 -> {111}; - 111 -> {118}; + 111 -> {112}; 112 -> {113}; - 113 -> {114}; + 113 -> {120}; 114 -> {115}; 115 -> {116}; 116 -> {117}; @@ -341,70 +346,70 @@ digraph boundSmartcastsInBranches_kt { 118 -> {119}; 119 -> {120}; 120 -> {121}; + 121 -> {122}; + 122 -> {123}; - subgraph cluster_29 { + subgraph cluster_30 { color=red - 122 [label="Enter function test_4" style="filled" fillcolor=red]; - 123 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_30 { + 124 [label="Enter function test_4" style="filled" fillcolor=red]; + 125 [label="Variable declaration: lval x: R|kotlin/Any|"]; + subgraph cluster_31 { color=blue - 124 [label="Enter when"]; - subgraph cluster_31 { - color=blue - 125 [label="Enter when branch condition "]; - 126 [label="Access variable R|/b|"]; - 127 [label="Exit when branch condition"]; - } + 126 [label="Enter when"]; subgraph cluster_32 { color=blue - 128 [label="Enter when branch condition else"]; + 127 [label="Enter when branch condition "]; + 128 [label="Access variable R|/b|"]; 129 [label="Exit when branch condition"]; } - 130 [label="Enter when branch result"]; subgraph cluster_33 { color=blue - 131 [label="Enter block"]; - 132 [label="Access variable R|/a|"]; - 133 [label="Assignmenet: R|/x|"]; - 134 [label="Exit block"]; + 130 [label="Enter when branch condition else"]; + 131 [label="Exit when branch condition"]; } - 135 [label="Exit when branch result"]; - 136 [label="Enter when branch result"]; + 132 [label="Enter when branch result"]; subgraph cluster_34 { color=blue - 137 [label="Enter block"]; - 138 [label="Access variable R|/a|"]; - 139 [label="Assignmenet: R|/x|"]; - 140 [label="Exit block"]; + 133 [label="Enter block"]; + 134 [label="Access variable R|/a|"]; + 135 [label="Assignmenet: R|/x|"]; + 136 [label="Exit block"]; } - 141 [label="Exit when branch result"]; - 142 [label="Exit when"]; + 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"]; } - 143 [label="Access variable R|/x|"]; - 144 [label="Type operator: (R|/x| as R|A|)"]; 145 [label="Access variable R|/x|"]; - 146 [label="Access variable R|/A.s|"]; - 147 [label="Access variable R|/a|"]; + 146 [label="Type operator: (R|/x| as R|A|)"]; + 147 [label="Access variable R|/x|"]; 148 [label="Access variable R|/A.s|"]; - 149 [label="Exit function test_4" style="filled" fillcolor=red]; + 149 [label="Access variable R|/a|"]; + 150 [label="Access variable R|/A.s|"]; + 151 [label="Exit function test_4" style="filled" fillcolor=red]; } - 122 -> {123}; - 123 -> {124}; 124 -> {125}; 125 -> {126}; 126 -> {127}; - 127 -> {136 128}; + 127 -> {128}; 128 -> {129}; - 129 -> {130}; + 129 -> {138 130}; 130 -> {131}; 131 -> {132}; 132 -> {133}; 133 -> {134}; 134 -> {135}; - 135 -> {142}; + 135 -> {136}; 136 -> {137}; - 137 -> {138}; + 137 -> {144}; 138 -> {139}; 139 -> {140}; 140 -> {141}; @@ -416,70 +421,70 @@ digraph boundSmartcastsInBranches_kt { 146 -> {147}; 147 -> {148}; 148 -> {149}; + 149 -> {150}; + 150 -> {151}; - subgraph cluster_35 { + subgraph cluster_36 { color=red - 150 [label="Enter function test_5" style="filled" fillcolor=red]; - 151 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_36 { + 152 [label="Enter function test_5" style="filled" fillcolor=red]; + 153 [label="Variable declaration: lval x: R|kotlin/Any|"]; + subgraph cluster_37 { color=blue - 152 [label="Enter when"]; - subgraph cluster_37 { - color=blue - 153 [label="Enter when branch condition "]; - 154 [label="Access variable R|/b|"]; - 155 [label="Exit when branch condition"]; - } + 154 [label="Enter when"]; subgraph cluster_38 { color=blue - 156 [label="Enter when branch condition else"]; + 155 [label="Enter when branch condition "]; + 156 [label="Access variable R|/b|"]; 157 [label="Exit when branch condition"]; } - 158 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 159 [label="Enter block"]; - 160 [label="Access variable R|/a|"]; - 161 [label="Assignmenet: R|/x|"]; - 162 [label="Exit block"]; + 158 [label="Enter when branch condition else"]; + 159 [label="Exit when branch condition"]; } - 163 [label="Exit when branch result"]; - 164 [label="Enter when branch result"]; + 160 [label="Enter when branch result"]; subgraph cluster_40 { color=blue - 165 [label="Enter block"]; - 166 [label="Access variable R|/a|"]; - 167 [label="Assignmenet: R|/x|"]; - 168 [label="Exit block"]; + 161 [label="Enter block"]; + 162 [label="Access variable R|/a|"]; + 163 [label="Assignmenet: R|/x|"]; + 164 [label="Exit block"]; } - 169 [label="Exit when branch result"]; - 170 [label="Exit when"]; + 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"]; } - 171 [label="Access variable R|/a|"]; - 172 [label="Type operator: (R|/a| as R|A|)"]; - 173 [label="Access variable R|/x|"]; - 174 [label="Access variable R|/A.s|"]; - 175 [label="Access variable R|/a|"]; + 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="Exit function test_5" style="filled" fillcolor=red]; + 177 [label="Access variable R|/a|"]; + 178 [label="Access variable R|/A.s|"]; + 179 [label="Exit function test_5" style="filled" fillcolor=red]; } - 150 -> {151}; - 151 -> {152}; 152 -> {153}; 153 -> {154}; 154 -> {155}; - 155 -> {164 156}; + 155 -> {156}; 156 -> {157}; - 157 -> {158}; + 157 -> {166 158}; 158 -> {159}; 159 -> {160}; 160 -> {161}; 161 -> {162}; 162 -> {163}; - 163 -> {170}; + 163 -> {164}; 164 -> {165}; - 165 -> {166}; + 165 -> {172}; 166 -> {167}; 167 -> {168}; 168 -> {169}; @@ -491,203 +496,203 @@ digraph boundSmartcastsInBranches_kt { 174 -> {175}; 175 -> {176}; 176 -> {177}; + 177 -> {178}; + 178 -> {179}; - subgraph cluster_41 { + subgraph cluster_42 { color=red - 178 [label="Enter function test_6" style="filled" fillcolor=red]; - 179 [label="Variable declaration: lval x: R|kotlin/Any|"]; - 180 [label="Access variable R|/a|"]; - 181 [label="Assignmenet: R|/x|"]; - 182 [label="Access variable R|/x|"]; - 183 [label="Access variable R|/A.s|"]; - 184 [label="Exit function test_6" style="filled" fillcolor=red]; + 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]; } - 178 -> {179}; - 179 -> {180}; 180 -> {181}; 181 -> {182}; 182 -> {183}; 183 -> {184}; + 184 -> {185}; + 185 -> {186}; - subgraph cluster_42 { + subgraph cluster_43 { color=red - 185 [label="Enter function test_7" style="filled" fillcolor=red]; - 186 [label="Const: Null(null)"]; - 187 [label="Variable declaration: lval z: R|kotlin/String?|"]; - 188 [label="Access variable R|/z|"]; - 189 [label="Variable declaration: lvar y: R|kotlin/String?|"]; - 190 [label="Access variable R|/y|"]; - 191 [label="Variable declaration: lval x: R|kotlin/String?|"]; - subgraph cluster_43 { + 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?|"]; + subgraph cluster_44 { color=blue - 192 [label="Enter when"]; - subgraph cluster_44 { - color=blue - 193 [label="Enter when branch condition "]; - 194 [label="Access variable R|/x|"]; - 195 [label="Const: Null(null)"]; - 196 [label="Operator !="]; - 197 [label="Exit when branch condition"]; - } - 198 [label="Synthetic else branch"]; - 199 [label="Enter when branch result"]; + 194 [label="Enter when"]; subgraph cluster_45 { color=blue - 200 [label="Enter block"]; - 201 [label="Access variable R|/x|"]; - 202 [label="Access variable R|kotlin/String.length|"]; - 203 [label="Access variable R|/y|"]; - 204 [label="Access variable R|kotlin/String.length|"]; - 205 [label="Access variable R|/z|"]; - 206 [label="Access variable R|kotlin/String.length|"]; - 207 [label="Exit block"]; + 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"]; } - 208 [label="Exit when branch result"]; - 209 [label="Exit when"]; - } - subgraph cluster_46 { - color=blue - 210 [label="Enter when"]; - subgraph cluster_47 { + 200 [label="Synthetic else branch"]; + 201 [label="Enter when branch result"]; + subgraph cluster_46 { color=blue - 211 [label="Enter when branch condition "]; - 212 [label="Access variable R|/y|"]; - 213 [label="Const: Null(null)"]; - 214 [label="Operator !="]; - 215 [label="Exit when branch condition"]; + 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"]; } - 216 [label="Synthetic else branch"]; - 217 [label="Enter when branch result"]; + 210 [label="Exit when branch result"]; + 211 [label="Exit when"]; + } + subgraph cluster_47 { + color=blue + 212 [label="Enter when"]; subgraph cluster_48 { color=blue - 218 [label="Enter block"]; - 219 [label="Access variable R|/x|"]; - 220 [label="Access variable R|kotlin/String.length|"]; - 221 [label="Access variable R|/y|"]; - 222 [label="Access variable R|kotlin/String.length|"]; - 223 [label="Access variable R|/z|"]; - 224 [label="Access variable R|kotlin/String.length|"]; - 225 [label="Exit block"]; + 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"]; } - 226 [label="Exit when branch result"]; - 227 [label="Exit when"]; - } - subgraph cluster_49 { - color=blue - 228 [label="Enter when"]; - subgraph cluster_50 { + 218 [label="Synthetic else branch"]; + 219 [label="Enter when branch result"]; + subgraph cluster_49 { color=blue - 229 [label="Enter when branch condition "]; - 230 [label="Access variable R|/z|"]; - 231 [label="Const: Null(null)"]; - 232 [label="Operator !="]; - 233 [label="Exit when branch condition"]; + 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"]; } - 234 [label="Synthetic else branch"]; - 235 [label="Enter when branch result"]; + 228 [label="Exit when branch result"]; + 229 [label="Exit when"]; + } + subgraph cluster_50 { + color=blue + 230 [label="Enter when"]; subgraph cluster_51 { color=blue - 236 [label="Enter block"]; - 237 [label="Access variable R|/x|"]; - 238 [label="Access variable R|kotlin/String.length|"]; - 239 [label="Access variable R|/y|"]; - 240 [label="Access variable R|kotlin/String.length|"]; - 241 [label="Access variable R|/z|"]; - 242 [label="Access variable R|kotlin/String.length|"]; - 243 [label="Exit block"]; + 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"]; } - 244 [label="Exit when branch result"]; - 245 [label="Exit when"]; - } - 246 [label="Const: Null(null)"]; - 247 [label="Assignmenet: R|/y|"]; - subgraph cluster_52 { - color=blue - 248 [label="Enter when"]; - subgraph cluster_53 { + 236 [label="Synthetic else branch"]; + 237 [label="Enter when branch result"]; + subgraph cluster_52 { color=blue - 249 [label="Enter when branch condition "]; - 250 [label="Access variable R|/x|"]; - 251 [label="Const: Null(null)"]; - 252 [label="Operator !="]; - 253 [label="Exit when branch condition"]; + 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"]; } - 254 [label="Synthetic else branch"]; - 255 [label="Enter when branch result"]; + 246 [label="Exit when branch result"]; + 247 [label="Exit when"]; + } + 248 [label="Const: Null(null)"]; + 249 [label="Assignmenet: R|/y|"]; + subgraph cluster_53 { + color=blue + 250 [label="Enter when"]; subgraph cluster_54 { color=blue - 256 [label="Enter block"]; - 257 [label="Access variable R|/x|"]; - 258 [label="Access variable R|kotlin/String.length|"]; - 259 [label="Access variable R|/y|"]; - 260 [label="Access variable #"]; - 261 [label="Access variable R|/z|"]; - 262 [label="Access variable R|kotlin/String.length|"]; - 263 [label="Exit block"]; + 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"]; } - 264 [label="Exit when branch result"]; - 265 [label="Exit when"]; - } - subgraph cluster_55 { - color=blue - 266 [label="Enter when"]; - subgraph cluster_56 { + 256 [label="Synthetic else branch"]; + 257 [label="Enter when branch result"]; + subgraph cluster_55 { color=blue - 267 [label="Enter when branch condition "]; - 268 [label="Access variable R|/y|"]; - 269 [label="Const: Null(null)"]; - 270 [label="Operator !="]; - 271 [label="Exit when branch condition"]; + 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"]; } - 272 [label="Synthetic else branch"]; - 273 [label="Enter when branch result"]; + 266 [label="Exit when branch result"]; + 267 [label="Exit when"]; + } + subgraph cluster_56 { + color=blue + 268 [label="Enter when"]; subgraph cluster_57 { color=blue - 274 [label="Enter block"]; - 275 [label="Access variable R|/x|"]; - 276 [label="Access variable #"]; - 277 [label="Access variable R|/y|"]; - 278 [label="Access variable R|kotlin/String.length|"]; - 279 [label="Access variable R|/z|"]; - 280 [label="Access variable #"]; - 281 [label="Exit block"]; + 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"]; } - 282 [label="Exit when branch result"]; - 283 [label="Exit when"]; - } - subgraph cluster_58 { - color=blue - 284 [label="Enter when"]; - subgraph cluster_59 { + 274 [label="Synthetic else branch"]; + 275 [label="Enter when branch result"]; + subgraph cluster_58 { color=blue - 285 [label="Enter when branch condition "]; - 286 [label="Access variable R|/z|"]; - 287 [label="Const: Null(null)"]; - 288 [label="Operator !="]; - 289 [label="Exit when branch condition"]; + 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"]; } - 290 [label="Synthetic else branch"]; - 291 [label="Enter when branch result"]; + 284 [label="Exit when branch result"]; + 285 [label="Exit when"]; + } + subgraph cluster_59 { + color=blue + 286 [label="Enter when"]; subgraph cluster_60 { color=blue - 292 [label="Enter block"]; - 293 [label="Access variable R|/x|"]; - 294 [label="Access variable R|kotlin/String.length|"]; - 295 [label="Access variable R|/y|"]; - 296 [label="Access variable #"]; - 297 [label="Access variable R|/z|"]; - 298 [label="Access variable R|kotlin/String.length|"]; - 299 [label="Exit block"]; + 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"]; } - 300 [label="Exit when branch result"]; - 301 [label="Exit when"]; + 292 [label="Synthetic else branch"]; + 293 [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"]; } - 302 [label="Exit function test_7" style="filled" fillcolor=red]; + 304 [label="Exit function test_7" style="filled" fillcolor=red]; } - 185 -> {186}; - 186 -> {187}; 187 -> {188}; 188 -> {189}; 189 -> {190}; @@ -698,10 +703,10 @@ digraph boundSmartcastsInBranches_kt { 194 -> {195}; 195 -> {196}; 196 -> {197}; - 197 -> {199 198}; - 198 -> {209}; - 199 -> {200}; - 200 -> {201}; + 197 -> {198}; + 198 -> {199}; + 199 -> {201 200}; + 200 -> {211}; 201 -> {202}; 202 -> {203}; 203 -> {204}; @@ -716,10 +721,10 @@ digraph boundSmartcastsInBranches_kt { 212 -> {213}; 213 -> {214}; 214 -> {215}; - 215 -> {217 216}; - 216 -> {227}; - 217 -> {218}; - 218 -> {219}; + 215 -> {216}; + 216 -> {217}; + 217 -> {219 218}; + 218 -> {229}; 219 -> {220}; 220 -> {221}; 221 -> {222}; @@ -734,10 +739,10 @@ digraph boundSmartcastsInBranches_kt { 230 -> {231}; 231 -> {232}; 232 -> {233}; - 233 -> {235 234}; - 234 -> {245}; - 235 -> {236}; - 236 -> {237}; + 233 -> {234}; + 234 -> {235}; + 235 -> {237 236}; + 236 -> {247}; 237 -> {238}; 238 -> {239}; 239 -> {240}; @@ -754,10 +759,10 @@ digraph boundSmartcastsInBranches_kt { 250 -> {251}; 251 -> {252}; 252 -> {253}; - 253 -> {255 254}; - 254 -> {265}; - 255 -> {256}; - 256 -> {257}; + 253 -> {254}; + 254 -> {255}; + 255 -> {257 256}; + 256 -> {267}; 257 -> {258}; 258 -> {259}; 259 -> {260}; @@ -772,10 +777,10 @@ digraph boundSmartcastsInBranches_kt { 268 -> {269}; 269 -> {270}; 270 -> {271}; - 271 -> {273 272}; - 272 -> {283}; - 273 -> {274}; - 274 -> {275}; + 271 -> {272}; + 272 -> {273}; + 273 -> {275 274}; + 274 -> {285}; 275 -> {276}; 276 -> {277}; 277 -> {278}; @@ -790,10 +795,10 @@ digraph boundSmartcastsInBranches_kt { 286 -> {287}; 287 -> {288}; 288 -> {289}; - 289 -> {291 290}; - 290 -> {301}; - 291 -> {292}; - 292 -> {293}; + 289 -> {290}; + 290 -> {291}; + 291 -> {293 292}; + 292 -> {303}; 293 -> {294}; 294 -> {295}; 295 -> {296}; @@ -803,5 +808,7 @@ digraph boundSmartcastsInBranches_kt { 299 -> {300}; 300 -> {301}; 301 -> {302}; + 302 -> {303}; + 303 -> {304}; } 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 809a0757b34..197df0836d2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot @@ -15,90 +15,105 @@ digraph functionCallBound_kt { subgraph cluster_1 { color=red - 3 [label="Enter function " style="filled" fillcolor=red]; - 4 [label="Delegated constructor call: super()"]; - 5 [label="Exit function " style="filled" fillcolor=red]; + 3 [label="Enter class Base" style="filled" fillcolor=red]; + 4 [label="Exit class Base" style="filled" fillcolor=red]; } - 3 -> {4}; - 4 -> {5}; + 3 -> {4} [color=green]; subgraph cluster_2 { color=red - 6 [label="Enter function getter" style="filled" fillcolor=red]; - 7 [label="Exit function getter" style="filled" fillcolor=red]; + 5 [label="Enter function " style="filled" fillcolor=red]; + 6 [label="Delegated constructor call: super()"]; + 7 [label="Exit function " style="filled" fillcolor=red]; } + 5 -> {6}; 6 -> {7}; subgraph cluster_3 { color=red - 8 [label="Enter property" style="filled" fillcolor=red]; - 9 [label="Access variable R|/data|"]; - 10 [label="Exit property" style="filled" fillcolor=red]; + 8 [label="Enter function getter" style="filled" fillcolor=red]; + 9 [label="Exit function getter" style="filled" fillcolor=red]; } 8 -> {9}; - 9 -> {10}; subgraph cluster_4 { color=red - 11 [label="Enter function isOk" style="filled" fillcolor=red]; - 12 [label="Const: Boolean(true)"]; - 13 [label="Jump: ^isOk Boolean(true)"]; - 14 [label="Stub" style="filled" fillcolor=gray]; - 15 [label="Exit function isOk" style="filled" fillcolor=red]; + 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}; - 12 -> {13}; - 13 -> {15}; - 13 -> {14} [style=dotted]; - 14 -> {15} [style=dotted]; subgraph cluster_5 { color=red - 16 [label="Enter function check" style="filled" fillcolor=red]; - subgraph cluster_6 { + 13 [label="Enter class Sub" style="filled" fillcolor=red]; + 14 [label="Exit class Sub" style="filled" fillcolor=red]; + } + + + 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]; + } + + 15 -> {16}; + 16 -> {17}; + 17 -> {19}; + 17 -> {18} [style=dotted]; + 18 -> {19} [style=dotted]; + + subgraph cluster_7 { + color=red + 20 [label="Enter function check" style="filled" fillcolor=red]; + subgraph cluster_8 { color=blue - 17 [label="Enter when"]; - subgraph cluster_7 { - color=blue - 18 [label="Enter when branch condition "]; - 19 [label="Access variable R|/base|"]; - 20 [label="Type operator: (R|/base| as? R|Sub|)"]; - 21 [label="Enter safe call"]; - 22 [label="Function call: (R|/base| as? R|Sub|)?.R|/isOk|()"]; - 23 [label="Exit safe call"]; - 24 [label="Const: Boolean(true)"]; - 25 [label="Operator =="]; - 26 [label="Exit when branch condition"]; - } - subgraph cluster_8 { - color=blue - 27 [label="Enter when branch condition else"]; - 28 [label="Exit when branch condition"]; - } - 29 [label="Enter when branch result"]; + 21 [label="Enter when"]; subgraph cluster_9 { color=blue - 30 [label="Enter block"]; - 31 [label="Access variable R|/base|"]; - 32 [label="Exit block"]; + 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"]; } - 33 [label="Exit when branch result"]; - 34 [label="Enter when branch result"]; subgraph cluster_10 { color=blue - 35 [label="Enter block"]; - 36 [label="Access variable R|/base|"]; - 37 [label="Access variable R|/Sub.data|"]; - 38 [label="Exit block"]; + 31 [label="Enter when branch condition else"]; + 32 [label="Exit when branch condition"]; } - 39 [label="Exit when branch result"]; - 40 [label="Exit when"]; + 33 [label="Enter when branch result"]; + subgraph cluster_11 { + color=blue + 34 [label="Enter block"]; + 35 [label="Access variable R|/base|"]; + 36 [label="Exit block"]; + } + 37 [label="Exit when branch result"]; + 38 [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"]; + } + 43 [label="Exit when branch result"]; + 44 [label="Exit when"]; } - 41 [label="Jump: ^check when () { + 45 [label="Jump: ^check when () { ==((R|/base| as? R|Sub|)?.R|/isOk|(), Boolean(true)) -> { R|/base|.R|/Sub.data| } @@ -107,37 +122,37 @@ digraph functionCallBound_kt { } } "]; - 42 [label="Stub" style="filled" fillcolor=gray]; - 43 [label="Exit function check" style="filled" fillcolor=red]; + 46 [label="Stub" style="filled" fillcolor=gray]; + 47 [label="Exit function check" style="filled" fillcolor=red]; } - 16 -> {17}; - 17 -> {18}; - 18 -> {19}; - 19 -> {20}; - 20 -> {21 23}; + 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; - 24 -> {25}; + 24 -> {25 27}; 25 -> {26}; - 26 -> {34 27}; + 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {31}; + 30 -> {38 31}; 31 -> {32}; 32 -> {33}; - 33 -> {40}; + 33 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {38}; + 37 -> {44}; 38 -> {39}; 39 -> {40}; 40 -> {41}; - 41 -> {43}; - 41 -> {42} [style=dotted]; - 42 -> {43} [style=dotted]; + 41 -> {42}; + 42 -> {43}; + 43 -> {44}; + 44 -> {45}; + 45 -> {47}; + 45 -> {46} [style=dotted]; + 46 -> {47} [style=dotted]; } 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 06c9c95eb11..3f6a6e63271 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot @@ -29,192 +29,199 @@ digraph elvis_kt { subgraph cluster_3 { color=red - 6 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_4 { - color=blue - 7 [label="Enter when"]; - subgraph cluster_5 { - color=blue - 8 [label="Enter when branch condition "]; - subgraph cluster_6 { - color=blue - 9 [label="Enter when"]; - 10 [label="Access variable R|/x|"]; - 11 [label="Enter safe call"]; - 12 [label="Access variable R|/A.b|"]; - 13 [label="Exit safe call"]; - 14 [label="Variable declaration: lval : R|kotlin/Boolean?|"]; - subgraph cluster_7 { - color=blue - 15 [label="Enter when branch condition "]; - 16 [label="Const: Null(null)"]; - 17 [label="Operator =="]; - 18 [label="Exit when branch condition"]; - } - subgraph cluster_8 { - color=blue - 19 [label="Enter when branch condition else"]; - 20 [label="Exit when branch condition"]; - } - 21 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 22 [label="Enter block"]; - 23 [label="Access variable R|/|"]; - 24 [label="Exit block"]; - } - 25 [label="Exit when branch result"]; - 26 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 27 [label="Enter block"]; - 28 [label="Jump: ^test_1 Unit"]; - 29 [label="Stub" style="filled" fillcolor=gray]; - 30 [label="Exit block" style="filled" fillcolor=gray]; - } - 31 [label="Exit when branch result" style="filled" fillcolor=gray]; - 32 [label="Exit when"]; - } - 33 [label="Exit when branch condition"]; - } - 34 [label="Synthetic else branch"]; - 35 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 36 [label="Enter block"]; - 37 [label="Access variable R|/x|"]; - 38 [label="Function call: R|/x|.R|/A.foo|()"]; - 39 [label="Exit block"]; - } - 40 [label="Exit when branch result"]; - 41 [label="Exit when"]; - } - 42 [label="Exit function test_1" style="filled" fillcolor=red]; + 6 [label="Enter class A" style="filled" fillcolor=red]; + 7 [label="Exit class A" style="filled" fillcolor=red]; + } + + + subgraph cluster_4 { + color=red + 8 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 9 [label="Enter when"]; + subgraph cluster_6 { + color=blue + 10 [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?|"]; + 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"]; + } + subgraph cluster_9 { + color=blue + 21 [label="Enter when branch condition else"]; + 22 [label="Exit when branch condition"]; + } + 23 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 24 [label="Enter block"]; + 25 [label="Access variable R|/|"]; + 26 [label="Exit block"]; + } + 27 [label="Exit when branch result"]; + 28 [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]; + } + 33 [label="Exit when branch result" style="filled" fillcolor=gray]; + 34 [label="Exit when"]; + } + 35 [label="Exit when branch condition"]; + } + 36 [label="Synthetic else branch"]; + 37 [label="Enter when branch result"]; + subgraph cluster_12 { + color=blue + 38 [label="Enter block"]; + 39 [label="Access variable R|/x|"]; + 40 [label="Function call: R|/x|.R|/A.foo|()"]; + 41 [label="Exit block"]; + } + 42 [label="Exit when branch result"]; + 43 [label="Exit when"]; + } + 44 [label="Exit function test_1" style="filled" fillcolor=red]; } - 6 -> {7}; - 7 -> {8}; 8 -> {9}; 9 -> {10}; - 10 -> {11 13}; + 10 -> {11}; 11 -> {12}; - 12 -> {13}; + 12 -> {13 15}; 13 -> {14}; 14 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; - 18 -> {26 19}; + 18 -> {19}; 19 -> {20}; - 20 -> {21}; + 20 -> {28 21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {32}; + 25 -> {26}; 26 -> {27}; - 27 -> {28}; - 28 -> {42}; - 28 -> {29} [style=dotted]; - 29 -> {30} [style=dotted]; + 27 -> {34}; + 28 -> {29}; + 29 -> {30}; + 30 -> {44}; 30 -> {31} [style=dotted]; 31 -> {32} [style=dotted]; - 32 -> {33}; - 33 -> {35 34}; - 34 -> {41}; - 35 -> {36}; - 36 -> {37}; + 32 -> {33} [style=dotted]; + 33 -> {34} [style=dotted]; + 34 -> {35}; + 35 -> {37 36}; + 36 -> {43}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; + 42 -> {43}; + 43 -> {44}; - subgraph cluster_12 { + subgraph cluster_13 { color=red - 43 [label="Enter function test2" style="filled" fillcolor=red]; - subgraph cluster_13 { + 45 [label="Enter function test2" style="filled" fillcolor=red]; + subgraph cluster_14 { color=blue - 44 [label="Enter when"]; - subgraph cluster_14 { - color=blue - 45 [label="Enter when branch condition "]; - 46 [label="Access variable R|/b|"]; - 47 [label="Type operator: (R|/b| !is R|kotlin/String|)"]; - 48 [label="Exit when branch condition"]; - } - 49 [label="Synthetic else branch"]; - 50 [label="Enter when branch result"]; + 46 [label="Enter when"]; subgraph cluster_15 { color=blue - 51 [label="Enter block"]; - 52 [label="Const: String()"]; - 53 [label="Jump: ^test2 String()"]; - 54 [label="Stub" style="filled" fillcolor=gray]; - 55 [label="Exit block" style="filled" fillcolor=gray]; + 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"]; } - 56 [label="Exit when branch result" style="filled" fillcolor=gray]; - 57 [label="Exit when"]; - } - subgraph cluster_16 { - color=blue - 58 [label="Enter when"]; - subgraph cluster_17 { + 51 [label="Synthetic else branch"]; + 52 [label="Enter when branch result"]; + subgraph cluster_16 { color=blue - 59 [label="Enter when branch condition "]; - 60 [label="Access variable R|/a|"]; - 61 [label="Type operator: (R|/a| !is R|kotlin/String?|)"]; - 62 [label="Exit when branch condition"]; + 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]; } - 63 [label="Synthetic else branch"]; - 64 [label="Enter when branch result"]; + 58 [label="Exit when branch result" style="filled" fillcolor=gray]; + 59 [label="Exit when"]; + } + subgraph cluster_17 { + color=blue + 60 [label="Enter when"]; subgraph cluster_18 { color=blue - 65 [label="Enter block"]; - 66 [label="Const: String()"]; - 67 [label="Jump: ^test2 String()"]; - 68 [label="Stub" style="filled" fillcolor=gray]; - 69 [label="Exit block" style="filled" fillcolor=gray]; + 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"]; } - 70 [label="Exit when branch result" style="filled" fillcolor=gray]; - 71 [label="Exit when"]; - } - subgraph cluster_19 { - color=blue - 72 [label="Enter when"]; - 73 [label="Access variable R|/a|"]; - 74 [label="Variable declaration: lval : R|kotlin/String?|"]; - subgraph cluster_20 { + 65 [label="Synthetic else branch"]; + 66 [label="Enter when branch result"]; + subgraph cluster_19 { color=blue - 75 [label="Enter when branch condition "]; - 76 [label="Const: Null(null)"]; - 77 [label="Operator =="]; - 78 [label="Exit when branch condition"]; + 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]; } + 72 [label="Exit when branch result" style="filled" fillcolor=gray]; + 73 [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?|"]; subgraph cluster_21 { color=blue - 79 [label="Enter when branch condition else"]; + 77 [label="Enter when branch condition "]; + 78 [label="Const: Null(null)"]; + 79 [label="Operator =="]; 80 [label="Exit when branch condition"]; } - 81 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 82 [label="Enter block"]; - 83 [label="Access variable R|/|"]; - 84 [label="Exit block"]; + 81 [label="Enter when branch condition else"]; + 82 [label="Exit when branch condition"]; } - 85 [label="Exit when branch result"]; - 86 [label="Enter when branch result"]; + 83 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 87 [label="Enter block"]; - 88 [label="Access variable R|/b|"]; - 89 [label="Exit block"]; + 84 [label="Enter block"]; + 85 [label="Access variable R|/|"]; + 86 [label="Exit block"]; } - 90 [label="Exit when branch result"]; - 91 [label="Exit when"]; + 87 [label="Exit when branch result"]; + 88 [label="Enter when branch result"]; + subgraph cluster_24 { + color=blue + 89 [label="Enter block"]; + 90 [label="Access variable R|/b|"]; + 91 [label="Exit block"]; + } + 92 [label="Exit when branch result"]; + 93 [label="Exit when"]; } - 92 [label="Jump: ^test2 when (lval : R|kotlin/String?| = R|/a|) { + 94 [label="Jump: ^test2 when (lval : R|kotlin/String?| = R|/a|) { ==($subj$, Null(null)) -> { R|/b| } @@ -223,63 +230,63 @@ digraph elvis_kt { } } "]; - 93 [label="Stub" style="filled" fillcolor=gray]; - 94 [label="Exit function test2" style="filled" fillcolor=red]; + 95 [label="Stub" style="filled" fillcolor=gray]; + 96 [label="Exit function test2" style="filled" fillcolor=red]; } - 43 -> {44}; - 44 -> {45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {50 49}; - 49 -> {57}; - 50 -> {51}; - 51 -> {52}; + 48 -> {49}; + 49 -> {50}; + 50 -> {52 51}; + 51 -> {59}; 52 -> {53}; - 53 -> {94}; - 53 -> {54} [style=dotted]; - 54 -> {55} [style=dotted]; + 53 -> {54}; + 54 -> {55}; + 55 -> {96}; 55 -> {56} [style=dotted]; 56 -> {57} [style=dotted]; - 57 -> {58}; - 58 -> {59}; + 57 -> {58} [style=dotted]; + 58 -> {59} [style=dotted]; 59 -> {60}; 60 -> {61}; 61 -> {62}; - 62 -> {64 63}; - 63 -> {71}; - 64 -> {65}; - 65 -> {66}; + 62 -> {63}; + 63 -> {64}; + 64 -> {66 65}; + 65 -> {73}; 66 -> {67}; - 67 -> {94}; - 67 -> {68} [style=dotted]; - 68 -> {69} [style=dotted]; + 67 -> {68}; + 68 -> {69}; + 69 -> {96}; 69 -> {70} [style=dotted]; 70 -> {71} [style=dotted]; - 71 -> {72}; - 72 -> {73}; + 71 -> {72} [style=dotted]; + 72 -> {73} [style=dotted]; 73 -> {74}; 74 -> {75}; 75 -> {76}; 76 -> {77}; 77 -> {78}; - 78 -> {86 79}; + 78 -> {79}; 79 -> {80}; - 80 -> {81}; + 80 -> {88 81}; 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {91}; + 85 -> {86}; 86 -> {87}; - 87 -> {88}; + 87 -> {93}; 88 -> {89}; 89 -> {90}; 90 -> {91}; 91 -> {92}; - 92 -> {94}; - 92 -> {93} [style=dotted]; - 93 -> {94} [style=dotted]; + 92 -> {93}; + 93 -> {94}; + 94 -> {96}; + 94 -> {95} [style=dotted]; + 95 -> {96} [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 683a6284d13..ae2ec0ee2f0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot @@ -144,114 +144,132 @@ digraph returns_kt { subgraph cluster_13 { color=red - 48 [label="Enter function bar" style="filled" fillcolor=red]; - 49 [label="Exit function bar" style="filled" fillcolor=red]; + 48 [label="Enter class A" style="filled" fillcolor=red]; + 49 [label="Exit class A" style="filled" fillcolor=red]; } - 48 -> {49}; + 48 -> {49} [color=green]; subgraph cluster_14 { color=red - 50 [label="Enter function baz" style="filled" fillcolor=red]; - 51 [label="Exit function baz" style="filled" fillcolor=red]; + 50 [label="Enter function bar" style="filled" fillcolor=red]; + 51 [label="Exit function bar" style="filled" fillcolor=red]; } 50 -> {51}; subgraph cluster_15 { color=red - 52 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_16 { + 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 { + color=red + 54 [label="Enter function baz" style="filled" fillcolor=red]; + 55 [label="Exit function baz" style="filled" fillcolor=red]; + } + + 54 -> {55}; + + subgraph cluster_17 { + color=red + 56 [label="Enter class C" style="filled" fillcolor=red]; + 57 [label="Exit class C" style="filled" fillcolor=red]; + } + + 56 -> {57} [color=green]; + + subgraph cluster_18 { + color=red + 58 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_19 { color=blue - 53 [label="Enter when"]; - subgraph cluster_17 { - color=blue - 54 [label="Enter when branch condition "]; - 55 [label="Access variable R|/x|"]; - 56 [label="Type operator: (R|/x| is R|B|)"]; - 57 [label="Exit when branch condition"]; - } - subgraph cluster_18 { - color=blue - 58 [label="Enter when branch condition "]; - 59 [label="Access variable R|/x|"]; - 60 [label="Type operator: (R|/x| is R|C|)"]; - 61 [label="Exit when branch condition"]; - } - subgraph cluster_19 { - color=blue - 62 [label="Enter when branch condition else"]; - 63 [label="Exit when branch condition"]; - } - 64 [label="Enter when branch result"]; + 59 [label="Enter when"]; subgraph cluster_20 { color=blue - 65 [label="Enter block"]; - 66 [label="Jump: ^test_2 Unit"]; - 67 [label="Stub" style="filled" fillcolor=gray]; - 68 [label="Exit block" style="filled" fillcolor=gray]; + 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"]; } - 69 [label="Exit when branch result" style="filled" fillcolor=gray]; - 70 [label="Enter when branch result"]; subgraph cluster_21 { color=blue - 71 [label="Enter block"]; - 72 [label="Access variable R|/x|"]; - 73 [label="Function call: R|/x|.R|/C.baz|()"]; - 74 [label="Exit block"]; + 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"]; } - 75 [label="Exit when branch result"]; - 76 [label="Enter when branch result"]; subgraph cluster_22 { + color=blue + 68 [label="Enter when branch condition else"]; + 69 [label="Exit when branch condition"]; + } + 70 [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]; + } + 75 [label="Exit when branch result" style="filled" fillcolor=gray]; + 76 [label="Enter when branch result"]; + subgraph cluster_24 { color=blue 77 [label="Enter block"]; 78 [label="Access variable R|/x|"]; - 79 [label="Function call: R|/x|.R|/B.bar|()"]; + 79 [label="Function call: R|/x|.R|/C.baz|()"]; 80 [label="Exit block"]; } 81 [label="Exit when branch result"]; - 82 [label="Exit when"]; + 82 [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"]; + } + 87 [label="Exit when branch result"]; + 88 [label="Exit when"]; } - 83 [label="Access variable R|/x|"]; - 84 [label="Function call: R|/x|.R|/A.foo|()"]; - 85 [label="Access variable R|/x|"]; - 86 [label="Function call: R|/x|.#()"]; - 87 [label="Access variable R|/x|"]; - 88 [label="Function call: R|/x|.#()"]; - 89 [label="Exit function test_2" style="filled" fillcolor=red]; + 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]; } - 52 -> {53}; - 53 -> {54}; - 54 -> {55}; - 55 -> {56}; - 56 -> {57}; - 57 -> {76 58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; - 61 -> {70 62}; + 61 -> {62}; 62 -> {63}; - 63 -> {64}; + 63 -> {82 64}; 64 -> {65}; 65 -> {66}; - 66 -> {89}; - 66 -> {67} [style=dotted]; - 67 -> {68} [style=dotted]; - 68 -> {69} [style=dotted]; - 69 -> {82} [style=dotted]; + 66 -> {67}; + 67 -> {76 68}; + 68 -> {69}; + 69 -> {70}; 70 -> {71}; 71 -> {72}; - 72 -> {73}; - 73 -> {74}; - 74 -> {75}; - 75 -> {82}; + 72 -> {95}; + 72 -> {73} [style=dotted]; + 73 -> {74} [style=dotted]; + 74 -> {75} [style=dotted]; + 75 -> {88} [style=dotted]; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; 80 -> {81}; - 81 -> {82}; + 81 -> {88}; 82 -> {83}; 83 -> {84}; 84 -> {85}; @@ -259,80 +277,80 @@ digraph returns_kt { 86 -> {87}; 87 -> {88}; 88 -> {89}; - - subgraph cluster_23 { - color=red - 90 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_24 { - color=blue - 91 [label="Enter when"]; - subgraph cluster_25 { - color=blue - 92 [label="Enter when branch condition "]; - 93 [label="Access variable R|/x|"]; - 94 [label="Type operator: (R|/x| is R|B|)"]; - 95 [label="Exit when branch condition"]; - } - subgraph cluster_26 { - color=blue - 96 [label="Enter when branch condition "]; - 97 [label="Access variable R|/x|"]; - 98 [label="Type operator: (R|/x| is R|C|)"]; - 99 [label="Exit when branch condition"]; - } - 100 [label="Synthetic else branch"]; - 101 [label="Enter when branch result"]; - subgraph cluster_27 { - color=blue - 102 [label="Enter block"]; - 103 [label="Access variable R|/x|"]; - 104 [label="Function call: R|/x|.R|/C.baz|()"]; - 105 [label="Exit block"]; - } - 106 [label="Exit when branch result"]; - 107 [label="Enter when branch result"]; - subgraph cluster_28 { - color=blue - 108 [label="Enter block"]; - 109 [label="Access variable R|/x|"]; - 110 [label="Function call: R|/x|.R|/B.bar|()"]; - 111 [label="Exit block"]; - } - 112 [label="Exit when branch result"]; - 113 [label="Exit when"]; - } - 114 [label="Access variable R|/x|"]; - 115 [label="Function call: R|/x|.#()"]; - 116 [label="Access variable R|/x|"]; - 117 [label="Function call: R|/x|.#()"]; - 118 [label="Access variable R|/x|"]; - 119 [label="Function call: R|/x|.#()"]; - 120 [label="Exit function test_3" style="filled" fillcolor=red]; - } - + 89 -> {90}; 90 -> {91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; 94 -> {95}; - 95 -> {107 96}; + + subgraph cluster_26 { + color=red + 96 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_27 { + color=blue + 97 [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"]; + } + 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"]; + } + 106 [label="Synthetic else branch"]; + 107 [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"]; + } + 112 [label="Exit when branch result"]; + 113 [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"]; + } + 118 [label="Exit when branch result"]; + 119 [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]; + } + 96 -> {97}; 97 -> {98}; 98 -> {99}; - 99 -> {101 100}; - 100 -> {113}; - 101 -> {102}; + 99 -> {100}; + 100 -> {101}; + 101 -> {113 102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; - 105 -> {106}; - 106 -> {113}; + 105 -> {107 106}; + 106 -> {119}; 107 -> {108}; 108 -> {109}; 109 -> {110}; 110 -> {111}; 111 -> {112}; - 112 -> {113}; + 112 -> {119}; 113 -> {114}; 114 -> {115}; 115 -> {116}; @@ -340,141 +358,147 @@ digraph returns_kt { 117 -> {118}; 118 -> {119}; 119 -> {120}; - - subgraph cluster_29 { - color=red - 121 [label="Enter function runHigherOrder" style="filled" fillcolor=red]; - 122 [label="Function call: R|/f|.R|FakeOverride|()"]; - 123 [label="Jump: ^runHigherOrder R|/f|.R|FakeOverride|()"]; - 124 [label="Stub" style="filled" fillcolor=gray]; - 125 [label="Exit function runHigherOrder" style="filled" fillcolor=red]; - } - + 120 -> {121}; 121 -> {122}; 122 -> {123}; - 123 -> {125}; - 123 -> {124} [style=dotted]; - 124 -> {125} [style=dotted]; - - subgraph cluster_30 { - color=red - 126 [label="Enter function getter" style="filled" fillcolor=red]; - 127 [label="Access variable R|kotlin/String.length|"]; - 128 [label="Jump: ^ this@R|/ext|.R|kotlin/String.length|"]; - 129 [label="Stub" style="filled" fillcolor=gray]; - 130 [label="Exit function getter" style="filled" fillcolor=red]; - } - - 126 -> {127}; - 127 -> {128}; - 128 -> {130}; - 128 -> {129} [style=dotted]; - 129 -> {130} [style=dotted]; - - subgraph cluster_31 { - color=red - 131 [label="Enter property" style="filled" fillcolor=red]; - 132 [label="Exit property" style="filled" fillcolor=red]; - } - - 131 -> {132}; + 123 -> {124}; + 124 -> {125}; + 125 -> {126}; subgraph cluster_32 { color=red - 133 [label="Enter function test_4" style="filled" fillcolor=red]; - 134 [label="Access variable R|/a|"]; - 135 [label="Type operator: (R|/a| as? R|kotlin/String|)"]; - 136 [label="Variable declaration: lval s: R|kotlin/String?|"]; - subgraph cluster_33 { - color=blue - 137 [label="Enter when"]; - 138 [label="Access variable R|/s|"]; - 139 [label="Enter safe call"]; - 140 [label="Access variable R|/ext|"]; - 141 [label="Exit safe call"]; - 142 [label="Variable declaration: lval : R|kotlin/Int?|"]; - subgraph cluster_34 { - color=blue - 143 [label="Enter when branch condition "]; - 144 [label="Const: Null(null)"]; - 145 [label="Operator =="]; - 146 [label="Exit when branch condition"]; - } - subgraph cluster_35 { - color=blue - 147 [label="Enter when branch condition else"]; - 148 [label="Exit when branch condition"]; - } - 149 [label="Enter when branch result"]; - subgraph cluster_36 { - color=blue - 150 [label="Enter block"]; - 151 [label="Access variable R|/|"]; - 152 [label="Exit block"]; - } - 153 [label="Exit when branch result"]; - 154 [label="Enter when branch result"]; - subgraph cluster_37 { - color=blue - 155 [label="Enter block"]; - 156 [label="Jump: ^test_4 Unit"]; - 157 [label="Stub" style="filled" fillcolor=gray]; - 158 [label="Exit block" style="filled" fillcolor=gray]; - } - 159 [label="Exit when branch result" style="filled" fillcolor=gray]; - 160 [label="Exit when"]; - } - 161 [label="Variable declaration: lval length: R|kotlin/Int|"]; - 162 [label="Postponed enter to lambda"]; - 163 [label="Postponed exit from lambda"]; - 164 [label="Function call: R|/runHigherOrder|(...)"]; - 165 [label="Exit function test_4" style="filled" fillcolor=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]; } + 127 -> {128}; + 128 -> {129}; + 129 -> {131}; + 129 -> {130} [style=dotted]; + 130 -> {131} [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]; + } + + 132 -> {133}; 133 -> {134}; - 134 -> {135}; - 135 -> {136}; - 136 -> {137}; + 134 -> {136}; + 134 -> {135} [style=dotted]; + 135 -> {136} [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}; - 138 -> {139 141}; + + 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?|"]; + 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?|"]; + 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"]; + } + subgraph cluster_38 { + color=blue + 153 [label="Enter when branch condition else"]; + 154 [label="Exit when branch condition"]; + } + 155 [label="Enter when branch result"]; + subgraph cluster_39 { + color=blue + 156 [label="Enter block"]; + 157 [label="Access variable R|/|"]; + 158 [label="Exit block"]; + } + 159 [label="Exit when branch result"]; + 160 [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]; + } + 165 [label="Exit when branch result" style="filled" fillcolor=gray]; + 166 [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]; + } + 139 -> {140}; 140 -> {141}; 141 -> {142}; 142 -> {143}; 143 -> {144}; - 144 -> {145}; + 144 -> {145 147}; 145 -> {146}; - 146 -> {154 147}; + 146 -> {147}; 147 -> {148}; 148 -> {149}; 149 -> {150}; 150 -> {151}; 151 -> {152}; - 152 -> {153}; - 153 -> {160}; + 152 -> {160 153}; + 153 -> {154}; 154 -> {155}; 155 -> {156}; - 156 -> {165}; - 156 -> {157} [style=dotted]; - 157 -> {158} [style=dotted]; - 158 -> {159} [style=dotted]; - 159 -> {160} [style=dotted]; + 156 -> {157}; + 157 -> {158}; + 158 -> {159}; + 159 -> {166}; 160 -> {161}; 161 -> {162}; - 162 -> {163 163} [color=green]; - 163 -> {164}; - 164 -> {165}; - - subgraph cluster_38 { - color=red - 166 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 167 [label="Access variable R|/s|"]; - 168 [label="Access variable R|kotlin/String.length|"]; - 169 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - + 162 -> {171}; + 162 -> {163} [style=dotted]; + 163 -> {164} [style=dotted]; + 164 -> {165} [style=dotted]; + 165 -> {166} [style=dotted]; 166 -> {167}; 167 -> {168}; - 168 -> {169}; + 168 -> {169 169} [color=green]; + 169 -> {170}; + 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}; + 174 -> {175}; } 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 bbfe1da298b..a2d2329e4ca 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot @@ -13,85 +13,91 @@ digraph smartcastFromArgument_kt { subgraph cluster_1 { color=red - 2 [label="Enter function takeA" style="filled" fillcolor=red]; - 3 [label="Const: Boolean(true)"]; - 4 [label="Jump: ^takeA Boolean(true)"]; - 5 [label="Stub" style="filled" fillcolor=gray]; - 6 [label="Exit function takeA" style="filled" fillcolor=red]; + 2 [label="Enter class A" style="filled" fillcolor=red]; + 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3}; - 3 -> {4}; - 4 -> {6}; - 4 -> {5} [style=dotted]; - 5 -> {6} [style=dotted]; + 2 -> {3} [color=green]; subgraph cluster_2 { color=red - 7 [label="Enter function test" style="filled" fillcolor=red]; - subgraph cluster_3 { - color=blue - 8 [label="Enter when"]; - subgraph cluster_4 { - color=blue - 9 [label="Enter when branch condition "]; - subgraph cluster_5 { - color=blue - 10 [label="Enter when"]; - 11 [label="Access variable R|/a|"]; - 12 [label="Type operator: (R|/a| as? R|A|)"]; - 13 [label="Variable declaration: lval : R|A?|"]; - subgraph cluster_6 { - color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Const: Null(null)"]; - 16 [label="Operator =="]; - 17 [label="Exit when branch condition"]; - } - subgraph cluster_7 { - color=blue - 18 [label="Enter when branch condition else"]; - 19 [label="Exit when branch condition"]; - } - 20 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 21 [label="Enter block"]; - 22 [label="Access variable R|/|"]; - 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="Jump: ^test Unit"]; - 28 [label="Stub" style="filled" fillcolor=gray]; - 29 [label="Exit block" style="filled" fillcolor=gray]; - } - 30 [label="Exit when branch result" style="filled" fillcolor=gray]; - 31 [label="Exit when"]; - } - 32 [label="Function call: R|/takeA|(...)"]; - 33 [label="Exit when branch condition"]; - } - 34 [label="Synthetic else branch"]; - 35 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 36 [label="Enter block"]; - 37 [label="Access variable R|/a|"]; - 38 [label="Function call: R|/a|.R|/A.foo|()"]; - 39 [label="Exit block"]; - } - 40 [label="Exit when branch result"]; - 41 [label="Exit when"]; - } - 42 [label="Exit function test" style="filled" fillcolor=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]; + } + + 4 -> {5}; + 5 -> {6}; + 6 -> {8}; + 6 -> {7} [style=dotted]; + 7 -> {8} [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"]; + subgraph cluster_5 { + color=blue + 11 [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?|"]; + 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"]; + } + subgraph cluster_8 { + color=blue + 20 [label="Enter when branch condition else"]; + 21 [label="Exit when branch condition"]; + } + 22 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 23 [label="Enter block"]; + 24 [label="Access variable R|/|"]; + 25 [label="Exit block"]; + } + 26 [label="Exit when branch result"]; + 27 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 28 [label="Enter block"]; + 29 [label="Jump: ^test Unit"]; + 30 [label="Stub" style="filled" fillcolor=gray]; + 31 [label="Exit block" style="filled" fillcolor=gray]; + } + 32 [label="Exit when branch result" style="filled" fillcolor=gray]; + 33 [label="Exit when"]; + } + 34 [label="Function call: R|/takeA|(...)"]; + 35 [label="Exit when branch condition"]; + } + 36 [label="Synthetic else branch"]; + 37 [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"]; + } + 42 [label="Exit when branch result"]; + 43 [label="Exit when"]; + } + 44 [label="Exit function test" style="filled" fillcolor=red]; } - 7 -> {8}; - 8 -> {9}; 9 -> {10}; 10 -> {11}; 11 -> {12}; @@ -100,31 +106,33 @@ digraph smartcastFromArgument_kt { 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {25 18}; + 17 -> {18}; 18 -> {19}; - 19 -> {20}; + 19 -> {27 20}; 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; - 24 -> {31}; + 24 -> {25}; 25 -> {26}; - 26 -> {27}; - 27 -> {42}; - 27 -> {28} [style=dotted]; - 28 -> {29} [style=dotted]; + 26 -> {33}; + 27 -> {28}; + 28 -> {29}; + 29 -> {44}; 29 -> {30} [style=dotted]; 30 -> {31} [style=dotted]; - 31 -> {32}; - 32 -> {33}; - 33 -> {35 34}; - 34 -> {41}; - 35 -> {36}; - 36 -> {37}; + 31 -> {32} [style=dotted]; + 32 -> {33} [style=dotted]; + 33 -> {34}; + 34 -> {35}; + 35 -> {37 36}; + 36 -> {43}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; + 42 -> {43}; + 43 -> {44}; } 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 52015bd8d76..deff5680b94 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot @@ -13,148 +13,160 @@ digraph when_kt { subgraph cluster_1 { color=red - 2 [label="Enter function bar" style="filled" fillcolor=red]; - 3 [label="Exit function bar" style="filled" fillcolor=red]; + 2 [label="Enter class A" style="filled" fillcolor=red]; + 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3}; + 2 -> {3} [color=green]; subgraph cluster_2 { color=red - 4 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_3 { - color=blue - 5 [label="Enter when"]; - subgraph cluster_4 { - color=blue - 6 [label="Enter when branch condition "]; - 7 [label="Access variable R|/x|"]; - 8 [label="Type operator: (R|/x| is R|A|)"]; - 9 [label="Exit when branch condition"]; - } - subgraph cluster_5 { - color=blue - 10 [label="Enter when branch condition "]; - 11 [label="Access variable R|/x|"]; - 12 [label="Type operator: (R|/x| is R|B|)"]; - 13 [label="Exit when branch condition"]; - } - 14 [label="Synthetic else branch"]; - 15 [label="Enter when branch result"]; - subgraph cluster_6 { - color=blue - 16 [label="Enter block"]; - 17 [label="Access variable R|/x|"]; - 18 [label="Function call: R|/x|.R|/B.bar|()"]; - 19 [label="Exit block"]; - } - 20 [label="Exit when branch result"]; - 21 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 22 [label="Enter block"]; - 23 [label="Access variable R|/x|"]; - 24 [label="Function call: R|/x|.R|/A.foo|()"]; - 25 [label="Exit block"]; - } - 26 [label="Exit when branch result"]; - 27 [label="Exit when"]; - } - subgraph cluster_8 { - color=blue - 28 [label="Enter when"]; - subgraph cluster_9 { - color=blue - 29 [label="Enter when branch condition "]; - 30 [label="Access variable R|/x|"]; - 31 [label="Type operator: (R|/x| !is R|A|)"]; - 32 [label="Exit when branch condition"]; - } - subgraph cluster_10 { - color=blue - 33 [label="Enter when branch condition "]; - 34 [label="Access variable R|/x|"]; - 35 [label="Type operator: (R|/x| !is R|B|)"]; - 36 [label="Exit when branch condition"]; - } - subgraph cluster_11 { - color=blue - 37 [label="Enter when branch condition "]; - 38 [label="Access variable R|/x|"]; - 39 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 40 [label="Exit when branch condition"]; - } - subgraph cluster_12 { - color=blue - 41 [label="Enter when branch condition else"]; - 42 [label="Exit when branch condition"]; - } - 43 [label="Enter when branch result"]; - subgraph cluster_13 { - color=blue - 44 [label="Enter block"]; - 45 [label="Access variable R|/x|"]; - 46 [label="Function call: R|/x|.R|/A.foo|()"]; - 47 [label="Access variable R|/x|"]; - 48 [label="Function call: R|/x|.R|/B.bar|()"]; - 49 [label="Exit block"]; - } - 50 [label="Exit when branch result"]; - 51 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 52 [label="Enter block"]; - 53 [label="Access variable R|/x|"]; - 54 [label="Function call: R|/x|.R|/A.foo|()"]; - 55 [label="Access variable R|/x|"]; - 56 [label="Function call: R|/x|.R|/B.bar|()"]; - 57 [label="Access variable R|/x|"]; - 58 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 59 [label="Exit block"]; - } - 60 [label="Exit when branch result"]; - 61 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 62 [label="Enter block"]; - 63 [label="Access variable R|/x|"]; - 64 [label="Function call: R|/x|.R|/A.foo|()"]; - 65 [label="Exit block"]; - } - 66 [label="Exit when branch result"]; - 67 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 68 [label="Enter block"]; - 69 [label="Exit block"]; - } - 70 [label="Exit when branch result"]; - 71 [label="Exit when"]; - } - 72 [label="Exit function test_1" style="filled" fillcolor=red]; + 4 [label="Enter function bar" style="filled" fillcolor=red]; + 5 [label="Exit function bar" style="filled" fillcolor=red]; } 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; + + subgraph cluster_3 { + color=red + 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]; + subgraph cluster_5 { + color=blue + 9 [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"]; + } + 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"]; + } + 18 [label="Synthetic else branch"]; + 19 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 20 [label="Enter block"]; + 21 [label="Access variable R|/x|"]; + 22 [label="Function call: R|/x|.R|/B.bar|()"]; + 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|/x|"]; + 28 [label="Function call: R|/x|.R|/A.foo|()"]; + 29 [label="Exit block"]; + } + 30 [label="Exit when branch result"]; + 31 [label="Exit when"]; + } + subgraph cluster_10 { + color=blue + 32 [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"]; + } + 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"]; + } + 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"]; + } + subgraph cluster_14 { + color=blue + 45 [label="Enter when branch condition else"]; + 46 [label="Exit when branch condition"]; + } + 47 [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"]; + } + 54 [label="Exit when branch result"]; + 55 [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|()"]; + 59 [label="Access variable R|/x|"]; + 60 [label="Function call: R|/x|.R|/B.bar|()"]; + 61 [label="Access variable R|/x|"]; + 62 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 63 [label="Exit block"]; + } + 64 [label="Exit when branch result"]; + 65 [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"]; + } + 70 [label="Exit when branch result"]; + 71 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 72 [label="Enter block"]; + 73 [label="Exit block"]; + } + 74 [label="Exit when branch result"]; + 75 [label="Exit when"]; + } + 76 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 8 -> {9}; - 9 -> {21 10}; + 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {15 14}; - 14 -> {27}; + 13 -> {25 14}; + 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {18}; - 18 -> {19}; + 17 -> {19 18}; + 18 -> {31}; 19 -> {20}; - 20 -> {27}; + 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; - 24 -> {25}; + 24 -> {31}; 25 -> {26}; 26 -> {27}; 27 -> {28}; @@ -162,179 +174,179 @@ digraph when_kt { 29 -> {30}; 30 -> {31}; 31 -> {32}; - 32 -> {67 33}; + 32 -> {33}; 33 -> {34}; 34 -> {35}; 35 -> {36}; - 36 -> {61 37}; + 36 -> {71 37}; 37 -> {38}; 38 -> {39}; 39 -> {40}; - 40 -> {51 41}; + 40 -> {65 41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; - 44 -> {45}; + 44 -> {55 45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; 48 -> {49}; 49 -> {50}; - 50 -> {71}; + 50 -> {51}; 51 -> {52}; 52 -> {53}; 53 -> {54}; - 54 -> {55}; + 54 -> {75}; 55 -> {56}; 56 -> {57}; 57 -> {58}; 58 -> {59}; 59 -> {60}; - 60 -> {71}; + 60 -> {61}; 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {65}; + 64 -> {75}; 65 -> {66}; - 66 -> {71}; + 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {71}; + 70 -> {75}; 71 -> {72}; - - subgraph cluster_17 { - color=red - 73 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_18 { - color=blue - 74 [label="Enter when"]; - 75 [label="Access variable R|/x|"]; - subgraph cluster_19 { - color=blue - 76 [label="Enter when branch condition "]; - 77 [label="Type operator: ($subj$ is R|A|)"]; - 78 [label="Exit when branch condition"]; - } - subgraph cluster_20 { - color=blue - 79 [label="Enter when branch condition "]; - 80 [label="Type operator: ($subj$ is R|B|)"]; - 81 [label="Exit when branch condition"]; - } - 82 [label="Synthetic else branch"]; - 83 [label="Enter when branch result"]; - subgraph cluster_21 { - color=blue - 84 [label="Enter block"]; - 85 [label="Access variable R|/x|"]; - 86 [label="Function call: R|/x|.R|/B.bar|()"]; - 87 [label="Exit block"]; - } - 88 [label="Exit when branch result"]; - 89 [label="Enter when branch result"]; - subgraph cluster_22 { - color=blue - 90 [label="Enter block"]; - 91 [label="Access variable R|/x|"]; - 92 [label="Function call: R|/x|.R|/A.foo|()"]; - 93 [label="Exit block"]; - } - 94 [label="Exit when branch result"]; - 95 [label="Exit when"]; - } - subgraph cluster_23 { - color=blue - 96 [label="Enter when"]; - 97 [label="Access variable R|/x|"]; - subgraph cluster_24 { - color=blue - 98 [label="Enter when branch condition "]; - 99 [label="Type operator: ($subj$ !is R|A|)"]; - 100 [label="Exit when branch condition"]; - } - subgraph cluster_25 { - color=blue - 101 [label="Enter when branch condition "]; - 102 [label="Type operator: ($subj$ !is R|B|)"]; - 103 [label="Exit when branch condition"]; - } - subgraph cluster_26 { - color=blue - 104 [label="Enter when branch condition "]; - 105 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; - 106 [label="Exit when branch condition"]; - } - subgraph cluster_27 { - color=blue - 107 [label="Enter when branch condition else"]; - 108 [label="Exit when branch condition"]; - } - 109 [label="Enter when branch result"]; - subgraph cluster_28 { - color=blue - 110 [label="Enter block"]; - 111 [label="Access variable R|/x|"]; - 112 [label="Function call: R|/x|.R|/A.foo|()"]; - 113 [label="Access variable R|/x|"]; - 114 [label="Function call: R|/x|.R|/B.bar|()"]; - 115 [label="Exit block"]; - } - 116 [label="Exit when branch result"]; - 117 [label="Enter when branch result"]; - subgraph cluster_29 { - color=blue - 118 [label="Enter block"]; - 119 [label="Access variable R|/x|"]; - 120 [label="Function call: R|/x|.R|/A.foo|()"]; - 121 [label="Access variable R|/x|"]; - 122 [label="Function call: R|/x|.R|/B.bar|()"]; - 123 [label="Access variable R|/x|"]; - 124 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 125 [label="Exit block"]; - } - 126 [label="Exit when branch result"]; - 127 [label="Enter when branch result"]; - subgraph cluster_30 { - color=blue - 128 [label="Enter block"]; - 129 [label="Access variable R|/x|"]; - 130 [label="Function call: R|/x|.R|/A.foo|()"]; - 131 [label="Exit block"]; - } - 132 [label="Exit when branch result"]; - 133 [label="Enter when branch result"]; - subgraph cluster_31 { - color=blue - 134 [label="Enter block"]; - 135 [label="Exit block"]; - } - 136 [label="Exit when branch result"]; - 137 [label="Exit when"]; - } - 138 [label="Exit function test_2" style="filled" fillcolor=red]; - } - + 72 -> {73}; 73 -> {74}; 74 -> {75}; 75 -> {76}; - 76 -> {77}; + + 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|"]; + 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"]; + } + 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"]; + } + 86 [label="Synthetic else branch"]; + 87 [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"]; + } + 92 [label="Exit when branch result"]; + 93 [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"]; + } + 98 [label="Exit when branch result"]; + 99 [label="Exit when"]; + } + subgraph cluster_25 { + color=blue + 100 [label="Enter when"]; + 101 [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"]; + } + 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"]; + } + 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"]; + } + subgraph cluster_29 { + color=blue + 111 [label="Enter when branch condition else"]; + 112 [label="Exit when branch condition"]; + } + 113 [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"]; + } + 120 [label="Exit when branch result"]; + 121 [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|()"]; + 125 [label="Access variable R|/x|"]; + 126 [label="Function call: R|/x|.R|/B.bar|()"]; + 127 [label="Access variable R|/x|"]; + 128 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 129 [label="Exit block"]; + } + 130 [label="Exit when branch result"]; + 131 [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"]; + } + 136 [label="Exit when branch result"]; + 137 [label="Enter when branch result"]; + subgraph cluster_33 { + color=blue + 138 [label="Enter block"]; + 139 [label="Exit block"]; + } + 140 [label="Exit when branch result"]; + 141 [label="Exit when"]; + } + 142 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 77 -> {78}; - 78 -> {89 79}; + 78 -> {79}; 79 -> {80}; 80 -> {81}; - 81 -> {83 82}; - 82 -> {95}; + 81 -> {82}; + 82 -> {93 83}; 83 -> {84}; 84 -> {85}; - 85 -> {86}; - 86 -> {87}; + 85 -> {87 86}; + 86 -> {99}; 87 -> {88}; - 88 -> {95}; + 88 -> {89}; 89 -> {90}; 90 -> {91}; 91 -> {92}; - 92 -> {93}; + 92 -> {99}; 93 -> {94}; 94 -> {95}; 95 -> {96}; @@ -342,198 +354,198 @@ digraph when_kt { 97 -> {98}; 98 -> {99}; 99 -> {100}; - 100 -> {133 101}; + 100 -> {101}; 101 -> {102}; 102 -> {103}; - 103 -> {127 104}; - 104 -> {105}; + 103 -> {104}; + 104 -> {137 105}; 105 -> {106}; - 106 -> {117 107}; - 107 -> {108}; + 106 -> {107}; + 107 -> {131 108}; 108 -> {109}; 109 -> {110}; - 110 -> {111}; + 110 -> {121 111}; 111 -> {112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; - 116 -> {137}; + 116 -> {117}; 117 -> {118}; 118 -> {119}; 119 -> {120}; - 120 -> {121}; + 120 -> {141}; 121 -> {122}; 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {137}; + 126 -> {127}; 127 -> {128}; 128 -> {129}; 129 -> {130}; - 130 -> {131}; + 130 -> {141}; 131 -> {132}; - 132 -> {137}; + 132 -> {133}; 133 -> {134}; 134 -> {135}; 135 -> {136}; - 136 -> {137}; + 136 -> {141}; 137 -> {138}; - - subgraph cluster_32 { - color=red - 139 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_33 { - color=blue - 140 [label="Enter when"]; - 141 [label="Access variable R|/x|"]; - 142 [label="Variable declaration: lval y: R|kotlin/Any?|"]; - subgraph cluster_34 { - color=blue - 143 [label="Enter when branch condition "]; - 144 [label="Type operator: ($subj$ is R|A|)"]; - 145 [label="Exit when branch condition"]; - } - subgraph cluster_35 { - color=blue - 146 [label="Enter when branch condition "]; - 147 [label="Type operator: ($subj$ is R|B|)"]; - 148 [label="Exit when branch condition"]; - } - 149 [label="Synthetic else branch"]; - 150 [label="Enter when branch result"]; - subgraph cluster_36 { - color=blue - 151 [label="Enter block"]; - 152 [label="Access variable R|/x|"]; - 153 [label="Function call: R|/x|.R|/B.bar|()"]; - 154 [label="Access variable R|/y|"]; - 155 [label="Function call: R|/y|.R|/B.bar|()"]; - 156 [label="Exit block"]; - } - 157 [label="Exit when branch result"]; - 158 [label="Enter when branch result"]; - subgraph cluster_37 { - color=blue - 159 [label="Enter block"]; - 160 [label="Access variable R|/x|"]; - 161 [label="Function call: R|/x|.R|/A.foo|()"]; - 162 [label="Access variable R|/y|"]; - 163 [label="Function call: R|/y|.R|/A.foo|()"]; - 164 [label="Exit block"]; - } - 165 [label="Exit when branch result"]; - 166 [label="Exit when"]; - } - subgraph cluster_38 { - color=blue - 167 [label="Enter when"]; - 168 [label="Access variable R|/x|"]; - 169 [label="Variable declaration: lval y: R|kotlin/Any?|"]; - subgraph cluster_39 { - color=blue - 170 [label="Enter when branch condition "]; - 171 [label="Type operator: ($subj$ !is R|A|)"]; - 172 [label="Exit when branch condition"]; - } - subgraph cluster_40 { - color=blue - 173 [label="Enter when branch condition "]; - 174 [label="Type operator: ($subj$ !is R|B|)"]; - 175 [label="Exit when branch condition"]; - } - subgraph cluster_41 { - color=blue - 176 [label="Enter when branch condition "]; - 177 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; - 178 [label="Exit when branch condition"]; - } - subgraph cluster_42 { - color=blue - 179 [label="Enter when branch condition else"]; - 180 [label="Exit when branch condition"]; - } - 181 [label="Enter when branch result"]; - subgraph cluster_43 { - color=blue - 182 [label="Enter block"]; - 183 [label="Access variable R|/x|"]; - 184 [label="Function call: R|/x|.R|/A.foo|()"]; - 185 [label="Access variable R|/x|"]; - 186 [label="Function call: R|/x|.R|/B.bar|()"]; - 187 [label="Access variable R|/y|"]; - 188 [label="Function call: R|/y|.R|/A.foo|()"]; - 189 [label="Access variable R|/y|"]; - 190 [label="Function call: R|/y|.R|/B.bar|()"]; - 191 [label="Exit block"]; - } - 192 [label="Exit when branch result"]; - 193 [label="Enter when branch result"]; - subgraph cluster_44 { - color=blue - 194 [label="Enter block"]; - 195 [label="Access variable R|/x|"]; - 196 [label="Function call: R|/x|.R|/A.foo|()"]; - 197 [label="Access variable R|/x|"]; - 198 [label="Function call: R|/x|.R|/B.bar|()"]; - 199 [label="Access variable R|/x|"]; - 200 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 201 [label="Access variable R|/y|"]; - 202 [label="Function call: R|/y|.R|/A.foo|()"]; - 203 [label="Access variable R|/y|"]; - 204 [label="Function call: R|/y|.R|/B.bar|()"]; - 205 [label="Access variable R|/y|"]; - 206 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 207 [label="Exit block"]; - } - 208 [label="Exit when branch result"]; - 209 [label="Enter when branch result"]; - subgraph cluster_45 { - color=blue - 210 [label="Enter block"]; - 211 [label="Access variable R|/x|"]; - 212 [label="Function call: R|/x|.R|/A.foo|()"]; - 213 [label="Access variable R|/y|"]; - 214 [label="Function call: R|/y|.R|/A.foo|()"]; - 215 [label="Exit block"]; - } - 216 [label="Exit when branch result"]; - 217 [label="Enter when branch result"]; - subgraph cluster_46 { - color=blue - 218 [label="Enter block"]; - 219 [label="Exit block"]; - } - 220 [label="Exit when branch result"]; - 221 [label="Exit when"]; - } - 222 [label="Exit function test_3" style="filled" fillcolor=red]; - } - + 138 -> {139}; 139 -> {140}; 140 -> {141}; 141 -> {142}; - 142 -> {143}; + + 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?|"]; + 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"]; + } + 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"]; + } + 153 [label="Synthetic else branch"]; + 154 [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"]; + } + 161 [label="Exit when branch result"]; + 162 [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"]; + } + 169 [label="Exit when branch result"]; + 170 [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?|"]; + 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"]; + } + 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"]; + } + 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"]; + } + subgraph cluster_44 { + color=blue + 183 [label="Enter when branch condition else"]; + 184 [label="Exit when branch condition"]; + } + 185 [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"]; + 197 [label="Enter when branch result"]; + subgraph cluster_46 { + color=blue + 198 [label="Enter block"]; + 199 [label="Access variable R|/x|"]; + 200 [label="Function call: R|/x|.R|/A.foo|()"]; + 201 [label="Access variable R|/x|"]; + 202 [label="Function call: R|/x|.R|/B.bar|()"]; + 203 [label="Access variable R|/x|"]; + 204 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 205 [label="Access variable R|/y|"]; + 206 [label="Function call: R|/y|.R|/A.foo|()"]; + 207 [label="Access variable R|/y|"]; + 208 [label="Function call: R|/y|.R|/B.bar|()"]; + 209 [label="Access variable R|/y|"]; + 210 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 211 [label="Exit block"]; + } + 212 [label="Exit when branch result"]; + 213 [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"]; + } + 220 [label="Exit when branch result"]; + 221 [label="Enter when branch result"]; + subgraph cluster_48 { + color=blue + 222 [label="Enter block"]; + 223 [label="Exit block"]; + } + 224 [label="Exit when branch result"]; + 225 [label="Exit when"]; + } + 226 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 143 -> {144}; 144 -> {145}; - 145 -> {158 146}; + 145 -> {146}; 146 -> {147}; 147 -> {148}; - 148 -> {150 149}; - 149 -> {166}; + 148 -> {149}; + 149 -> {162 150}; 150 -> {151}; 151 -> {152}; - 152 -> {153}; - 153 -> {154}; + 152 -> {154 153}; + 153 -> {170}; 154 -> {155}; 155 -> {156}; 156 -> {157}; - 157 -> {166}; + 157 -> {158}; 158 -> {159}; 159 -> {160}; 160 -> {161}; - 161 -> {162}; + 161 -> {170}; 162 -> {163}; 163 -> {164}; 164 -> {165}; @@ -544,17 +556,17 @@ digraph when_kt { 169 -> {170}; 170 -> {171}; 171 -> {172}; - 172 -> {217 173}; + 172 -> {173}; 173 -> {174}; 174 -> {175}; - 175 -> {209 176}; - 176 -> {177}; + 175 -> {176}; + 176 -> {221 177}; 177 -> {178}; - 178 -> {193 179}; - 179 -> {180}; + 178 -> {179}; + 179 -> {213 180}; 180 -> {181}; 181 -> {182}; - 182 -> {183}; + 182 -> {197 183}; 183 -> {184}; 184 -> {185}; 185 -> {186}; @@ -564,11 +576,11 @@ digraph when_kt { 189 -> {190}; 190 -> {191}; 191 -> {192}; - 192 -> {221}; + 192 -> {193}; 193 -> {194}; 194 -> {195}; 195 -> {196}; - 196 -> {197}; + 196 -> {225}; 197 -> {198}; 198 -> {199}; 199 -> {200}; @@ -580,70 +592,74 @@ digraph when_kt { 205 -> {206}; 206 -> {207}; 207 -> {208}; - 208 -> {221}; + 208 -> {209}; 209 -> {210}; 210 -> {211}; 211 -> {212}; - 212 -> {213}; + 212 -> {225}; 213 -> {214}; 214 -> {215}; 215 -> {216}; - 216 -> {221}; + 216 -> {217}; 217 -> {218}; 218 -> {219}; 219 -> {220}; - 220 -> {221}; + 220 -> {225}; 221 -> {222}; - - subgraph cluster_47 { - color=red - 223 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_48 { - color=blue - 224 [label="Enter when"]; - 225 [label="Access variable R|/x|"]; - 226 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - subgraph cluster_49 { - color=blue - 227 [label="Enter when branch condition "]; - 228 [label="Const: Int(1)"]; - 229 [label="Operator =="]; - 230 [label="Exit when branch condition"]; - } - 231 [label="Synthetic else branch"]; - 232 [label="Enter when branch result"]; - subgraph cluster_50 { - color=blue - 233 [label="Enter block"]; - 234 [label="Access variable R|/x|"]; - 235 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 236 [label="Exit block"]; - } - 237 [label="Exit when branch result"]; - 238 [label="Exit when"]; - } - 239 [label="Access variable R|/x|"]; - 240 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 241 [label="Exit function test_4" style="filled" fillcolor=red]; - } - + 222 -> {223}; 223 -> {224}; 224 -> {225}; 225 -> {226}; - 226 -> {227}; + + 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|)"]; + 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"]; + } + 235 [label="Synthetic else branch"]; + 236 [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"]; + } + 241 [label="Exit when branch result"]; + 242 [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]; + } + 227 -> {228}; 228 -> {229}; 229 -> {230}; - 230 -> {232 231}; - 231 -> {238}; + 230 -> {231}; + 231 -> {232}; 232 -> {233}; 233 -> {234}; - 234 -> {235}; - 235 -> {236}; + 234 -> {236 235}; + 235 -> {242}; 236 -> {237}; 237 -> {238}; 238 -> {239}; 239 -> {240}; 240 -> {241}; + 241 -> {242}; + 242 -> {243}; + 243 -> {244}; + 244 -> {245}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot index 7466c35eba1..e223c199d05 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot @@ -13,70 +13,76 @@ digraph equalsAndIdentity_kt { subgraph cluster_1 { color=red - 2 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 3 [label="Enter when"]; - subgraph cluster_3 { - color=blue - 4 [label="Enter when branch condition "]; - 5 [label="Access variable R|/x|"]; - 6 [label="Access variable R|/y|"]; - 7 [label="Operator =="]; - 8 [label="Exit when branch condition"]; - } - 9 [label="Synthetic else branch"]; - 10 [label="Enter when branch result"]; - subgraph cluster_4 { - color=blue - 11 [label="Enter block"]; - 12 [label="Access variable R|/x|"]; - 13 [label="Function call: R|/x|.R|/A.foo|()"]; - 14 [label="Access variable R|/y|"]; - 15 [label="Function call: R|/y|.R|/A.foo|()"]; - 16 [label="Exit block"]; - } - 17 [label="Exit when branch result"]; - 18 [label="Exit when"]; - } - subgraph cluster_5 { - color=blue - 19 [label="Enter when"]; - subgraph cluster_6 { - color=blue - 20 [label="Enter when branch condition "]; - 21 [label="Access variable R|/x|"]; - 22 [label="Access variable R|/y|"]; - 23 [label="Operator ==="]; - 24 [label="Exit when branch condition"]; - } - 25 [label="Synthetic else branch"]; - 26 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 27 [label="Enter block"]; - 28 [label="Access variable R|/x|"]; - 29 [label="Function call: R|/x|.R|/A.foo|()"]; - 30 [label="Access variable R|/y|"]; - 31 [label="Function call: R|/y|.R|/A.foo|()"]; - 32 [label="Exit block"]; - } - 33 [label="Exit when branch result"]; - 34 [label="Exit when"]; - } - 35 [label="Exit function test_1" style="filled" fillcolor=red]; + 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_1" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 5 [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"]; + } + 11 [label="Synthetic else branch"]; + 12 [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"]; + } + 19 [label="Exit when branch result"]; + 20 [label="Exit when"]; + } + subgraph cluster_6 { + color=blue + 21 [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"]; + } + 27 [label="Synthetic else branch"]; + 28 [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"]; + } + 35 [label="Exit when branch result"]; + 36 [label="Exit when"]; + } + 37 [label="Exit function test_1" style="filled" fillcolor=red]; } - 2 -> {3}; - 3 -> {4}; 4 -> {5}; 5 -> {6}; 6 -> {7}; 7 -> {8}; - 8 -> {10 9}; - 9 -> {18}; - 10 -> {11}; - 11 -> {12}; + 8 -> {9}; + 9 -> {10}; + 10 -> {12 11}; + 11 -> {20}; 12 -> {13}; 13 -> {14}; 14 -> {15}; @@ -89,10 +95,10 @@ digraph equalsAndIdentity_kt { 21 -> {22}; 22 -> {23}; 23 -> {24}; - 24 -> {26 25}; - 25 -> {34}; - 26 -> {27}; - 27 -> {28}; + 24 -> {25}; + 25 -> {26}; + 26 -> {28 27}; + 27 -> {36}; 28 -> {29}; 29 -> {30}; 30 -> {31}; @@ -100,73 +106,73 @@ digraph equalsAndIdentity_kt { 32 -> {33}; 33 -> {34}; 34 -> {35}; + 35 -> {36}; + 36 -> {37}; - subgraph cluster_8 { + subgraph cluster_9 { color=red - 36 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_9 { + 38 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_10 { color=blue - 37 [label="Enter when"]; - subgraph cluster_10 { - color=blue - 38 [label="Enter when branch condition "]; - 39 [label="Access variable R|/x|"]; - 40 [label="Access variable R|/y|"]; - 41 [label="Operator =="]; - 42 [label="Exit when branch condition"]; - } - 43 [label="Synthetic else branch"]; - 44 [label="Enter when branch result"]; + 39 [label="Enter when"]; subgraph cluster_11 { color=blue - 45 [label="Enter block"]; - 46 [label="Access variable R|/x|"]; - 47 [label="Function call: R|/x|.#()"]; - 48 [label="Access variable R|/y|"]; - 49 [label="Function call: R|/y|.#()"]; - 50 [label="Exit block"]; + 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"]; } - 51 [label="Exit when branch result"]; - 52 [label="Exit when"]; - } - subgraph cluster_12 { - color=blue - 53 [label="Enter when"]; - subgraph cluster_13 { + 45 [label="Synthetic else branch"]; + 46 [label="Enter when branch result"]; + subgraph cluster_12 { color=blue - 54 [label="Enter when branch condition "]; - 55 [label="Access variable R|/x|"]; - 56 [label="Access variable R|/y|"]; - 57 [label="Operator ==="]; - 58 [label="Exit when branch condition"]; + 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"]; } - 59 [label="Synthetic else branch"]; - 60 [label="Enter when branch result"]; + 53 [label="Exit when branch result"]; + 54 [label="Exit when"]; + } + subgraph cluster_13 { + color=blue + 55 [label="Enter when"]; subgraph cluster_14 { color=blue - 61 [label="Enter block"]; - 62 [label="Access variable R|/x|"]; - 63 [label="Function call: R|/x|.#()"]; - 64 [label="Access variable R|/y|"]; - 65 [label="Function call: R|/y|.#()"]; - 66 [label="Exit block"]; + 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"]; } - 67 [label="Exit when branch result"]; - 68 [label="Exit when"]; + 61 [label="Synthetic else branch"]; + 62 [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"]; + } + 69 [label="Exit when branch result"]; + 70 [label="Exit when"]; } - 69 [label="Exit function test_2" style="filled" fillcolor=red]; + 71 [label="Exit function test_2" style="filled" fillcolor=red]; } - 36 -> {37}; - 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {44 43}; - 43 -> {52}; - 44 -> {45}; - 45 -> {46}; + 42 -> {43}; + 43 -> {44}; + 44 -> {46 45}; + 45 -> {54}; 46 -> {47}; 47 -> {48}; 48 -> {49}; @@ -179,10 +185,10 @@ digraph equalsAndIdentity_kt { 55 -> {56}; 56 -> {57}; 57 -> {58}; - 58 -> {60 59}; - 59 -> {68}; - 60 -> {61}; - 61 -> {62}; + 58 -> {59}; + 59 -> {60}; + 60 -> {62 61}; + 61 -> {70}; 62 -> {63}; 63 -> {64}; 64 -> {65}; @@ -190,111 +196,111 @@ digraph equalsAndIdentity_kt { 66 -> {67}; 67 -> {68}; 68 -> {69}; + 69 -> {70}; + 70 -> {71}; - subgraph cluster_15 { + subgraph cluster_16 { color=red - 70 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_16 { + 72 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_17 { color=blue - 71 [label="Enter when"]; - subgraph cluster_17 { - color=blue - 72 [label="Enter when branch condition "]; - 73 [label="Access variable R|/y|"]; - 74 [label="Const: Null(null)"]; - 75 [label="Operator =="]; - 76 [label="Exit when branch condition"]; - } - 77 [label="Synthetic else branch"]; - 78 [label="Enter when branch result"]; + 73 [label="Enter when"]; subgraph cluster_18 { color=blue - 79 [label="Enter block"]; - 80 [label="Jump: ^test_3 Unit"]; - 81 [label="Stub" style="filled" fillcolor=gray]; - 82 [label="Exit block" style="filled" fillcolor=gray]; + 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"]; } - 83 [label="Exit when branch result" style="filled" fillcolor=gray]; - 84 [label="Exit when"]; - } - subgraph cluster_19 { - color=blue - 85 [label="Enter when"]; - subgraph cluster_20 { + 79 [label="Synthetic else branch"]; + 80 [label="Enter when branch result"]; + subgraph cluster_19 { color=blue - 86 [label="Enter when branch condition "]; - 87 [label="Access variable R|/x|"]; - 88 [label="Access variable R|/y|"]; - 89 [label="Operator =="]; - 90 [label="Exit when branch condition"]; + 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]; } - 91 [label="Synthetic else branch"]; - 92 [label="Enter when branch result"]; + 85 [label="Exit when branch result" style="filled" fillcolor=gray]; + 86 [label="Exit when"]; + } + subgraph cluster_20 { + color=blue + 87 [label="Enter when"]; subgraph cluster_21 { color=blue - 93 [label="Enter block"]; - 94 [label="Access variable R|/x|"]; - 95 [label="Function call: R|/x|.R|/A.foo|()"]; - 96 [label="Access variable R|/y|"]; - 97 [label="Function call: R|/y|.R|/A.foo|()"]; - 98 [label="Exit block"]; + 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"]; } - 99 [label="Exit when branch result"]; - 100 [label="Exit when"]; - } - subgraph cluster_22 { - color=blue - 101 [label="Enter when"]; - subgraph cluster_23 { + 93 [label="Synthetic else branch"]; + 94 [label="Enter when branch result"]; + subgraph cluster_22 { color=blue - 102 [label="Enter when branch condition "]; - 103 [label="Access variable R|/x|"]; - 104 [label="Access variable R|/y|"]; - 105 [label="Operator ==="]; - 106 [label="Exit when branch condition"]; + 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"]; } - 107 [label="Synthetic else branch"]; - 108 [label="Enter when branch result"]; + 101 [label="Exit when branch result"]; + 102 [label="Exit when"]; + } + subgraph cluster_23 { + color=blue + 103 [label="Enter when"]; subgraph cluster_24 { color=blue - 109 [label="Enter block"]; - 110 [label="Access variable R|/x|"]; - 111 [label="Function call: R|/x|.R|/A.foo|()"]; - 112 [label="Access variable R|/y|"]; - 113 [label="Function call: R|/y|.R|/A.foo|()"]; - 114 [label="Exit block"]; + 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"]; } - 115 [label="Exit when branch result"]; - 116 [label="Exit when"]; + 109 [label="Synthetic else branch"]; + 110 [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"]; + } + 117 [label="Exit when branch result"]; + 118 [label="Exit when"]; } - 117 [label="Exit function test_3" style="filled" fillcolor=red]; + 119 [label="Exit function test_3" style="filled" fillcolor=red]; } - 70 -> {71}; - 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; 75 -> {76}; - 76 -> {78 77}; - 77 -> {84}; - 78 -> {79}; - 79 -> {80}; - 80 -> {117}; - 80 -> {81} [style=dotted]; - 81 -> {82} [style=dotted]; + 76 -> {77}; + 77 -> {78}; + 78 -> {80 79}; + 79 -> {86}; + 80 -> {81}; + 81 -> {82}; + 82 -> {119}; 82 -> {83} [style=dotted]; 83 -> {84} [style=dotted]; - 84 -> {85}; - 85 -> {86}; + 84 -> {85} [style=dotted]; + 85 -> {86} [style=dotted]; 86 -> {87}; 87 -> {88}; 88 -> {89}; 89 -> {90}; - 90 -> {92 91}; - 91 -> {100}; - 92 -> {93}; - 93 -> {94}; + 90 -> {91}; + 91 -> {92}; + 92 -> {94 93}; + 93 -> {102}; 94 -> {95}; 95 -> {96}; 96 -> {97}; @@ -307,10 +313,10 @@ digraph equalsAndIdentity_kt { 103 -> {104}; 104 -> {105}; 105 -> {106}; - 106 -> {108 107}; - 107 -> {116}; - 108 -> {109}; - 109 -> {110}; + 106 -> {107}; + 107 -> {108}; + 108 -> {110 109}; + 109 -> {118}; 110 -> {111}; 111 -> {112}; 112 -> {113}; @@ -318,5 +324,7 @@ digraph equalsAndIdentity_kt { 114 -> {115}; 115 -> {116}; 116 -> {117}; + 117 -> {118}; + 118 -> {119}; } 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 f9587a353ab..36fd6f4adbd 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot @@ -13,171 +13,187 @@ digraph inPlaceLambdas_kt { subgraph cluster_1 { color=red - 2 [label="Enter function bar" style="filled" fillcolor=red]; - 3 [label="Exit function bar" style="filled" fillcolor=red]; + 2 [label="Enter class A" style="filled" fillcolor=red]; + 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3}; + 2 -> {3} [color=green]; subgraph cluster_2 { color=red - 4 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_3 { - color=blue - 5 [label="Enter when"]; - subgraph cluster_4 { - color=blue - 6 [label="Enter when branch condition "]; - 7 [label="Access variable R|/x|"]; - 8 [label="Type operator: (R|/x| is R|A|)"]; - 9 [label="Exit when branch condition"]; - } - 10 [label="Synthetic else branch"]; - 11 [label="Enter when branch result"]; - subgraph cluster_5 { - color=blue - 12 [label="Enter block"]; - 13 [label="Postponed enter to lambda"]; - subgraph cluster_6 { - color=blue - 14 [label="Enter function anonymousFunction"]; - 15 [label="Access variable R|/x|"]; - 16 [label="Function call: R|/x|.R|/A.foo|()"]; - 17 [label="Exit function anonymousFunction"]; - } - 18 [label="Call arguments union" style="filled" fillcolor=yellow]; - 19 [label="Postponed exit from lambda"]; - 20 [label="Function call: R|kotlin/run|(...)"]; - 21 [label="Exit block"]; - } - 22 [label="Exit when branch result"]; - 23 [label="Exit when"]; - } - 24 [label="Exit function test_1" style="filled" fillcolor=red]; + 4 [label="Enter function bar" style="filled" fillcolor=red]; + 5 [label="Exit function bar" style="filled" fillcolor=red]; } 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; - 8 -> {9}; - 9 -> {11 10}; - 10 -> {23}; - 11 -> {12}; - 12 -> {13}; - 13 -> {14}; - 13 -> {19} [color=red]; - 14 -> {15}; - 15 -> {16}; - 16 -> {17}; - 17 -> {19} [color=green]; - 17 -> {18} [color=red]; - 18 -> {20} [color=red]; - 19 -> {20} [color=green]; - 20 -> {21}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; - subgraph cluster_7 { + subgraph cluster_3 { color=red - 25 [label="Enter function test_2" style="filled" fillcolor=red]; - 26 [label="Postponed enter to lambda"]; - subgraph cluster_8 { - color=blue - 27 [label="Enter function anonymousFunction"]; - 28 [label="Access variable R|/x|"]; - 29 [label="Type operator: (R|/x| as R|B|)"]; - 30 [label="Exit function anonymousFunction"]; - } - 31 [label="Call arguments union" style="filled" fillcolor=yellow]; - 32 [label="Postponed exit from lambda"]; - 33 [label="Function call: R|kotlin/run|(...)"]; - 34 [label="Access variable R|/x|"]; - 35 [label="Function call: R|/x|.R|/B.bar|()"]; - 36 [label="Exit function test_2" style="filled" fillcolor=red]; + 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]; + subgraph cluster_5 { + color=blue + 9 [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"]; + } + 14 [label="Synthetic else branch"]; + 15 [label="Enter when branch result"]; + subgraph cluster_7 { + color=blue + 16 [label="Enter block"]; + 17 [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|()"]; + 21 [label="Exit function anonymousFunction"]; + } + 22 [label="Call arguments union" style="filled" fillcolor=yellow]; + 23 [label="Postponed exit from lambda"]; + 24 [label="Function call: R|kotlin/run|(...)"]; + 25 [label="Exit block"]; + } + 26 [label="Exit when branch result"]; + 27 [label="Exit when"]; + } + 28 [label="Exit function test_1" style="filled" fillcolor=red]; + } + + 8 -> {9}; + 9 -> {10}; + 10 -> {11}; + 11 -> {12}; + 12 -> {13}; + 13 -> {15 14}; + 14 -> {27}; + 15 -> {16}; + 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}; 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}; - 35 -> {36}; subgraph cluster_9 { color=red - 37 [label="Enter function test_3" style="filled" fillcolor=red]; + 29 [label="Enter function test_2" style="filled" fillcolor=red]; + 30 [label="Postponed enter to lambda"]; subgraph cluster_10 { color=blue - 38 [label="Enter when"]; - subgraph cluster_11 { - color=blue - 39 [label="Enter when branch condition "]; - 40 [label="Access variable R|/x|"]; - 41 [label="Type operator: (R|/x| is R|A|)"]; - 42 [label="Exit when branch condition"]; - } - 43 [label="Synthetic else branch"]; - 44 [label="Enter when branch result"]; - subgraph cluster_12 { - color=blue - 45 [label="Enter block"]; - 46 [label="Postponed enter to lambda"]; - subgraph cluster_13 { - color=blue - 47 [label="Enter function anonymousFunction"]; - 48 [label="Access variable R|/x|"]; - 49 [label="Function call: R|/x|.R|/A.foo|()"]; - 50 [label="Access variable R|/x|"]; - 51 [label="Type operator: (R|/x| as R|B|)"]; - 52 [label="Exit function anonymousFunction"]; - } - 53 [label="Call arguments union" style="filled" fillcolor=yellow]; - 54 [label="Postponed exit from lambda"]; - 55 [label="Function call: R|kotlin/run|(...)"]; - 56 [label="Access variable R|/x|"]; - 57 [label="Function call: R|/x|.R|/B.bar|()"]; - 58 [label="Exit block"]; - } - 59 [label="Exit when branch result"]; - 60 [label="Exit when"]; + 31 [label="Enter function anonymousFunction"]; + 32 [label="Access variable R|/x|"]; + 33 [label="Type operator: (R|/x| as R|B|)"]; + 34 [label="Exit function anonymousFunction"]; } - 61 [label="Exit function test_3" style="filled" fillcolor=red]; + 35 [label="Call arguments union" style="filled" fillcolor=yellow]; + 36 [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]; } + 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}; 39 -> {40}; - 40 -> {41}; + + subgraph cluster_11 { + color=red + 41 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_12 { + color=blue + 42 [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"]; + } + 47 [label="Synthetic else branch"]; + 48 [label="Enter when branch result"]; + subgraph cluster_14 { + color=blue + 49 [label="Enter block"]; + 50 [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"]; + } + 57 [label="Call arguments union" style="filled" fillcolor=yellow]; + 58 [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"]; + } + 63 [label="Exit when branch result"]; + 64 [label="Exit when"]; + } + 65 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 41 -> {42}; - 42 -> {44 43}; - 43 -> {60}; + 42 -> {43}; + 43 -> {44}; 44 -> {45}; 45 -> {46}; - 46 -> {47}; - 46 -> {54} [color=red]; - 47 -> {48}; + 46 -> {48 47}; + 47 -> {64}; 48 -> {49}; 49 -> {50}; 50 -> {51}; + 50 -> {58} [color=red]; 51 -> {52}; - 52 -> {54} [color=green]; - 52 -> {53} [color=red]; - 53 -> {55} [color=red]; - 54 -> {55} [color=green]; + 52 -> {53}; + 53 -> {54}; + 54 -> {55}; 55 -> {56}; - 56 -> {57}; - 57 -> {58}; - 58 -> {59}; + 56 -> {58} [color=green]; + 56 -> {57} [color=red]; + 57 -> {59} [color=red]; + 58 -> {59} [color=green]; 59 -> {60}; 60 -> {61}; + 61 -> {62}; + 62 -> {63}; + 63 -> {64}; + 64 -> {65}; } 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 5cf47207fe2..af7c37f6f7b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot @@ -13,65 +13,89 @@ digraph dataFlowInfoFromWhileCondition_kt { subgraph cluster_1 { color=red - 2 [label="Enter function test" style="filled" fillcolor=red]; - 3 [label="Const: Null(null)"]; - 4 [label="Variable declaration: lvar a: R|A?|"]; - subgraph cluster_2 { - color=blue - 5 [label="Enter while loop"]; - subgraph cluster_3 { - color=blue - 6 [label="Enter loop condition"]; - subgraph cluster_4 { - color=blue - 7 [label="Enter ||"]; - 8 [label="Access variable R|/a|"]; - 9 [label="Type operator: (R|/a| is R|B|)"]; - 10 [label="Exit left part of ||"]; - 11 [label="Enter right part of ||"]; - 12 [label="Access variable R|/a|"]; - 13 [label="Type operator: (R|/a| is R|C|)"]; - 14 [label="Exit ||"]; - } - 15 [label="Exit loop condition"]; - } - subgraph cluster_5 { - color=blue - 16 [label="Enter loop block"]; - subgraph cluster_6 { - color=blue - 17 [label="Enter block"]; - 18 [label="Access variable R|/a|"]; - 19 [label="Function call: R|/a|.R|/A.foo|()"]; - 20 [label="Exit block"]; - } - 21 [label="Exit loop block"]; - } - 22 [label="Exit whileloop"]; - } - 23 [label="Exit function test" style="filled" fillcolor=red]; + 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 class B" style="filled" fillcolor=red]; + 5 [label="Exit class B" style="filled" fillcolor=red]; + } + + 4 -> {5} [color=green]; + + subgraph cluster_3 { + color=red + 6 [label="Enter class C" style="filled" fillcolor=red]; + 7 [label="Exit class C" style="filled" fillcolor=red]; + } + + 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?|"]; + subgraph cluster_5 { + color=blue + 11 [label="Enter while loop"]; + subgraph cluster_6 { + color=blue + 12 [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 ||"]; + } + 21 [label="Exit loop condition"]; + } + subgraph cluster_8 { + color=blue + 22 [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"]; + } + 27 [label="Exit loop block"]; + } + 28 [label="Exit whileloop"]; + } + 29 [label="Exit function test" style="filled" fillcolor=red]; } - 2 -> {3}; - 3 -> {4}; - 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; 8 -> {9}; 9 -> {10}; - 10 -> {14 11}; + 10 -> {11}; 11 -> {12}; 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {22 16}; - 16 -> {17}; + 15 -> {16}; + 16 -> {20 17}; 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {6}; + 21 -> {28 22}; 22 -> {23}; + 23 -> {24}; + 24 -> {25}; + 25 -> {26}; + 26 -> {27}; + 27 -> {12}; + 28 -> {29}; } 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 9340551aa28..070c619cf1a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot @@ -13,502 +13,508 @@ digraph endlessLoops_kt { subgraph cluster_1 { color=red - 2 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 3 [label="Enter while loop"]; - subgraph cluster_3 { - color=blue - 4 [label="Enter loop condition"]; - 5 [label="Const: Boolean(true)"]; - 6 [label="Exit loop condition"]; - } - subgraph cluster_4 { - color=blue - 7 [label="Enter loop block"]; - subgraph cluster_5 { - color=blue - 8 [label="Enter block"]; - 9 [label="Access variable R|/x|"]; - 10 [label="Type operator: (R|/x| as R|A|)"]; - subgraph cluster_6 { - color=blue - 11 [label="Enter when"]; - subgraph cluster_7 { - color=blue - 12 [label="Enter when branch condition "]; - 13 [label="Access variable R|/b|"]; - 14 [label="Exit when branch condition"]; - } - 15 [label="Synthetic else branch"]; - 16 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 17 [label="Enter block"]; - 18 [label="Jump: break@@@[Boolean(true)] "]; - 19 [label="Stub" style="filled" fillcolor=gray]; - 20 [label="Exit block" style="filled" fillcolor=gray]; - } - 21 [label="Exit when branch result" style="filled" fillcolor=gray]; - 22 [label="Exit when"]; - } - 23 [label="Exit block"]; - } - 24 [label="Exit loop block"]; - } - 25 [label="Exit whileloop"]; - } - 26 [label="Access variable R|/x|"]; - 27 [label="Function call: R|/x|.R|/A.foo|()"]; - 28 [label="Exit function test_1" style="filled" fillcolor=red]; + 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_1" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 5 [label="Enter while loop"]; + subgraph cluster_4 { + color=blue + 6 [label="Enter loop condition"]; + 7 [label="Const: Boolean(true)"]; + 8 [label="Exit loop condition"]; + } + subgraph cluster_5 { + color=blue + 9 [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|)"]; + subgraph cluster_7 { + color=blue + 13 [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="Synthetic else branch"]; + 18 [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]; + } + 23 [label="Exit when branch result" style="filled" fillcolor=gray]; + 24 [label="Exit when"]; + } + 25 [label="Exit block"]; + } + 26 [label="Exit loop block"]; + } + 27 [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]; } - 2 -> {3}; - 3 -> {4}; 4 -> {5}; 5 -> {6}; 6 -> {7}; - 6 -> {25} [style=dotted]; 7 -> {8}; 8 -> {9}; + 8 -> {27} [style=dotted]; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; 13 -> {14}; - 14 -> {16 15}; - 15 -> {22}; - 16 -> {17}; - 17 -> {18}; - 18 -> {25}; - 18 -> {19} [style=dotted]; - 19 -> {20} [style=dotted]; + 14 -> {15}; + 15 -> {16}; + 16 -> {18 17}; + 17 -> {24}; + 18 -> {19}; + 19 -> {20}; + 20 -> {27}; 20 -> {21} [style=dotted]; 21 -> {22} [style=dotted]; - 22 -> {23}; - 23 -> {24}; - 24 -> {4}; + 22 -> {23} [style=dotted]; + 23 -> {24} [style=dotted]; + 24 -> {25}; 25 -> {26}; - 26 -> {27}; + 26 -> {6}; 27 -> {28}; + 28 -> {29}; + 29 -> {30}; - subgraph cluster_9 { + subgraph cluster_10 { color=red - 29 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_10 { + 31 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_11 { color=blue - 30 [label="Enter while loop"]; - subgraph cluster_11 { - color=blue - 31 [label="Enter loop condition"]; - 32 [label="Const: Boolean(true)"]; - 33 [label="Exit loop condition"]; - } + 32 [label="Enter while loop"]; subgraph cluster_12 { color=blue - 34 [label="Enter loop block"]; - subgraph cluster_13 { + 33 [label="Enter loop condition"]; + 34 [label="Const: Boolean(true)"]; + 35 [label="Exit loop condition"]; + } + subgraph cluster_13 { + color=blue + 36 [label="Enter loop block"]; + subgraph cluster_14 { color=blue - 35 [label="Enter block"]; - subgraph cluster_14 { + 37 [label="Enter block"]; + subgraph cluster_15 { color=blue - 36 [label="Enter when"]; - subgraph cluster_15 { - color=blue - 37 [label="Enter when branch condition "]; - 38 [label="Access variable R|/b|"]; - 39 [label="Exit when branch condition"]; - } - 40 [label="Synthetic else branch"]; - 41 [label="Enter when branch result"]; + 38 [label="Enter when"]; subgraph cluster_16 { color=blue - 42 [label="Enter block"]; - 43 [label="Access variable R|/x|"]; - 44 [label="Type operator: (R|/x| as R|A|)"]; - 45 [label="Jump: break@@@[Boolean(true)] "]; - 46 [label="Stub" style="filled" fillcolor=gray]; - 47 [label="Exit block" style="filled" fillcolor=gray]; + 39 [label="Enter when branch condition "]; + 40 [label="Access variable R|/b|"]; + 41 [label="Exit when branch condition"]; } - 48 [label="Exit when branch result" style="filled" fillcolor=gray]; - 49 [label="Exit when"]; + 42 [label="Synthetic else branch"]; + 43 [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]; + } + 50 [label="Exit when branch result" style="filled" fillcolor=gray]; + 51 [label="Exit when"]; } - 50 [label="Exit block"]; + 52 [label="Exit block"]; } - 51 [label="Exit loop block"]; + 53 [label="Exit loop block"]; } - 52 [label="Exit whileloop"]; + 54 [label="Exit whileloop"]; } - 53 [label="Access variable R|/x|"]; - 54 [label="Function call: R|/x|.R|/A.foo|()"]; - 55 [label="Exit function test_2" style="filled" fillcolor=red]; + 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]; } - 29 -> {30}; - 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 33 -> {52} [style=dotted]; 34 -> {35}; 35 -> {36}; + 35 -> {54} [style=dotted]; 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {41 40}; - 40 -> {49}; - 41 -> {42}; - 42 -> {43}; + 39 -> {40}; + 40 -> {41}; + 41 -> {43 42}; + 42 -> {51}; 43 -> {44}; 44 -> {45}; - 45 -> {52}; - 45 -> {46} [style=dotted]; - 46 -> {47} [style=dotted]; + 45 -> {46}; + 46 -> {47}; + 47 -> {54}; 47 -> {48} [style=dotted]; 48 -> {49} [style=dotted]; - 49 -> {50}; - 50 -> {51}; - 51 -> {31}; + 49 -> {50} [style=dotted]; + 50 -> {51} [style=dotted]; + 51 -> {52}; 52 -> {53}; - 53 -> {54}; + 53 -> {33}; 54 -> {55}; + 55 -> {56}; + 56 -> {57}; - subgraph cluster_17 { + subgraph cluster_18 { color=red - 56 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_18 { + 58 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_19 { color=blue - 57 [label="Enter while loop"]; - subgraph cluster_19 { - color=blue - 58 [label="Enter loop condition"]; - 59 [label="Const: Boolean(true)"]; - 60 [label="Exit loop condition"]; - } + 59 [label="Enter while loop"]; subgraph cluster_20 { color=blue - 61 [label="Enter loop block"]; - subgraph cluster_21 { + 60 [label="Enter loop condition"]; + 61 [label="Const: Boolean(true)"]; + 62 [label="Exit loop condition"]; + } + subgraph cluster_21 { + color=blue + 63 [label="Enter loop block"]; + subgraph cluster_22 { color=blue - 62 [label="Enter block"]; - 63 [label="Access variable R|/x|"]; - 64 [label="Type operator: (R|/x| as R|A|)"]; - subgraph cluster_22 { + 64 [label="Enter block"]; + 65 [label="Access variable R|/x|"]; + 66 [label="Type operator: (R|/x| as R|A|)"]; + subgraph cluster_23 { color=blue - 65 [label="Enter when"]; - subgraph cluster_23 { - color=blue - 66 [label="Enter when branch condition "]; - 67 [label="Access variable R|/b|"]; - 68 [label="Exit when branch condition"]; - } - 69 [label="Synthetic else branch"]; - 70 [label="Enter when branch result"]; + 67 [label="Enter when"]; subgraph cluster_24 { color=blue - 71 [label="Enter block"]; - 72 [label="Jump: break@@@[Boolean(true)] "]; - 73 [label="Stub" style="filled" fillcolor=gray]; - 74 [label="Exit block" style="filled" fillcolor=gray]; + 68 [label="Enter when branch condition "]; + 69 [label="Access variable R|/b|"]; + 70 [label="Exit when branch condition"]; } - 75 [label="Exit when branch result" style="filled" fillcolor=gray]; - 76 [label="Exit when"]; - } - subgraph cluster_25 { - color=blue - 77 [label="Enter when"]; - subgraph cluster_26 { + 71 [label="Synthetic else branch"]; + 72 [label="Enter when branch result"]; + subgraph cluster_25 { color=blue - 78 [label="Enter when branch condition "]; - 79 [label="Access variable R|/b|"]; - 80 [label="Exit when branch condition"]; + 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]; } - 81 [label="Synthetic else branch"]; - 82 [label="Enter when branch result"]; + 77 [label="Exit when branch result" style="filled" fillcolor=gray]; + 78 [label="Exit when"]; + } + subgraph cluster_26 { + color=blue + 79 [label="Enter when"]; 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]; + 80 [label="Enter when branch condition "]; + 81 [label="Access variable R|/b|"]; + 82 [label="Exit when branch condition"]; } - 87 [label="Exit when branch result" style="filled" fillcolor=gray]; - 88 [label="Exit when"]; + 83 [label="Synthetic else branch"]; + 84 [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]; + } + 89 [label="Exit when branch result" style="filled" fillcolor=gray]; + 90 [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"]; + 93 [label="Exit whileloop"]; } - 92 [label="Access variable R|/x|"]; - 93 [label="Function call: R|/x|.R|/A.foo|()"]; - 94 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - 56 -> {57}; - 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; - 60 -> {91} [style=dotted]; 61 -> {62}; 62 -> {63}; + 62 -> {93} [style=dotted]; 63 -> {64}; 64 -> {65}; 65 -> {66}; 66 -> {67}; 67 -> {68}; - 68 -> {70 69}; - 69 -> {76}; - 70 -> {71}; - 71 -> {72}; - 72 -> {91}; - 72 -> {73} [style=dotted]; - 73 -> {74} [style=dotted]; + 68 -> {69}; + 69 -> {70}; + 70 -> {72 71}; + 71 -> {78}; + 72 -> {73}; + 73 -> {74}; + 74 -> {93}; 74 -> {75} [style=dotted]; 75 -> {76} [style=dotted]; - 76 -> {77}; - 77 -> {78}; + 76 -> {77} [style=dotted]; + 77 -> {78} [style=dotted]; 78 -> {79}; 79 -> {80}; - 80 -> {82 81}; - 81 -> {88}; - 82 -> {83}; - 83 -> {84}; - 84 -> {91}; - 84 -> {85} [style=dotted]; - 85 -> {86} [style=dotted]; + 80 -> {81}; + 81 -> {82}; + 82 -> {84 83}; + 83 -> {90}; + 84 -> {85}; + 85 -> {86}; + 86 -> {93}; 86 -> {87} [style=dotted]; 87 -> {88} [style=dotted]; - 88 -> {89}; - 89 -> {90}; - 90 -> {58}; + 88 -> {89} [style=dotted]; + 89 -> {90} [style=dotted]; + 90 -> {91}; 91 -> {92}; - 92 -> {93}; + 92 -> {60}; 93 -> {94}; + 94 -> {95}; + 95 -> {96}; - subgraph cluster_28 { + subgraph cluster_29 { color=red - 95 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_29 { + 97 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_30 { color=blue - 96 [label="Enter while loop"]; - subgraph cluster_30 { - color=blue - 97 [label="Enter loop condition"]; - 98 [label="Const: Boolean(true)"]; - 99 [label="Exit loop condition"]; - } + 98 [label="Enter while loop"]; subgraph cluster_31 { color=blue - 100 [label="Enter loop block"]; - subgraph cluster_32 { + 99 [label="Enter loop condition"]; + 100 [label="Const: Boolean(true)"]; + 101 [label="Exit loop condition"]; + } + subgraph cluster_32 { + color=blue + 102 [label="Enter loop block"]; + subgraph cluster_33 { color=blue - 101 [label="Enter block"]; - subgraph cluster_33 { + 103 [label="Enter block"]; + subgraph cluster_34 { color=blue - 102 [label="Enter when"]; - subgraph cluster_34 { - color=blue - 103 [label="Enter when branch condition "]; - 104 [label="Access variable R|/b|"]; - 105 [label="Exit when branch condition"]; - } - 106 [label="Synthetic else branch"]; - 107 [label="Enter when branch result"]; + 104 [label="Enter when"]; subgraph cluster_35 { color=blue - 108 [label="Enter block"]; - 109 [label="Access variable R|/x|"]; - 110 [label="Type operator: (R|/x| as R|A|)"]; - 111 [label="Jump: break@@@[Boolean(true)] "]; - 112 [label="Stub" style="filled" fillcolor=gray]; - 113 [label="Exit block" style="filled" fillcolor=gray]; + 105 [label="Enter when branch condition "]; + 106 [label="Access variable R|/b|"]; + 107 [label="Exit when branch condition"]; } - 114 [label="Exit when branch result" style="filled" fillcolor=gray]; - 115 [label="Exit when"]; + 108 [label="Synthetic else branch"]; + 109 [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]; + } + 116 [label="Exit when branch result" style="filled" fillcolor=gray]; + 117 [label="Exit when"]; } - 116 [label="Jump: break@@@[Boolean(true)] "]; - 117 [label="Stub" style="filled" fillcolor=gray]; - 118 [label="Exit block" style="filled" fillcolor=gray]; + 118 [label="Jump: break@@@[Boolean(true)] "]; + 119 [label="Stub" style="filled" fillcolor=gray]; + 120 [label="Exit block" style="filled" fillcolor=gray]; } - 119 [label="Exit loop block" style="filled" fillcolor=gray]; + 121 [label="Exit loop block" style="filled" fillcolor=gray]; } - 120 [label="Exit whileloop"]; + 122 [label="Exit whileloop"]; } - 121 [label="Access variable R|/x|"]; - 122 [label="Function call: R|/x|.#()"]; - 123 [label="Exit function test_4" style="filled" fillcolor=red]; + 123 [label="Access variable R|/x|"]; + 124 [label="Function call: R|/x|.#()"]; + 125 [label="Exit function test_4" style="filled" fillcolor=red]; } - 95 -> {96}; - 96 -> {97}; 97 -> {98}; 98 -> {99}; 99 -> {100}; - 99 -> {120} [style=dotted]; 100 -> {101}; 101 -> {102}; + 101 -> {122} [style=dotted]; 102 -> {103}; 103 -> {104}; 104 -> {105}; - 105 -> {107 106}; - 106 -> {115}; - 107 -> {108}; - 108 -> {109}; + 105 -> {106}; + 106 -> {107}; + 107 -> {109 108}; + 108 -> {117}; 109 -> {110}; 110 -> {111}; - 111 -> {120}; - 111 -> {112} [style=dotted]; - 112 -> {113} [style=dotted]; + 111 -> {112}; + 112 -> {113}; + 113 -> {122}; 113 -> {114} [style=dotted]; 114 -> {115} [style=dotted]; - 115 -> {116}; - 116 -> {120}; + 115 -> {116} [style=dotted]; 116 -> {117} [style=dotted]; - 117 -> {118} [style=dotted]; + 117 -> {118}; + 118 -> {122}; 118 -> {119} [style=dotted]; - 119 -> {97} [style=dotted]; - 120 -> {121}; - 121 -> {122}; + 119 -> {120} [style=dotted]; + 120 -> {121} [style=dotted]; + 121 -> {99} [style=dotted]; 122 -> {123}; + 123 -> {124}; + 124 -> {125}; - subgraph cluster_36 { + subgraph cluster_37 { color=red - 124 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_37 { + 126 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_38 { color=blue - 125 [label="Enter do-while loop"]; - subgraph cluster_38 { + 127 [label="Enter do-while loop"]; + subgraph cluster_39 { color=blue - 126 [label="Enter loop block"]; - subgraph cluster_39 { + 128 [label="Enter loop block"]; + subgraph cluster_40 { color=blue - 127 [label="Enter block"]; - subgraph cluster_40 { + 129 [label="Enter block"]; + subgraph cluster_41 { color=blue - 128 [label="Enter when"]; - subgraph cluster_41 { - color=blue - 129 [label="Enter when branch condition "]; - 130 [label="Access variable R|/b|"]; - 131 [label="Exit when branch condition"]; - } - 132 [label="Synthetic else branch"]; - 133 [label="Enter when branch result"]; + 130 [label="Enter when"]; subgraph cluster_42 { color=blue - 134 [label="Enter block"]; - 135 [label="Access variable R|/x|"]; - 136 [label="Type operator: (R|/x| as R|A|)"]; - 137 [label="Jump: break@@@[Boolean(true)] "]; - 138 [label="Stub" style="filled" fillcolor=gray]; - 139 [label="Exit block" style="filled" fillcolor=gray]; + 131 [label="Enter when branch condition "]; + 132 [label="Access variable R|/b|"]; + 133 [label="Exit when branch condition"]; } - 140 [label="Exit when branch result" style="filled" fillcolor=gray]; - 141 [label="Exit when"]; + 134 [label="Synthetic else branch"]; + 135 [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]; + } + 142 [label="Exit when branch result" style="filled" fillcolor=gray]; + 143 [label="Exit when"]; } - 142 [label="Exit block"]; + 144 [label="Exit block"]; } - 143 [label="Exit loop block"]; + 145 [label="Exit loop block"]; } - subgraph cluster_43 { + subgraph cluster_44 { color=blue - 144 [label="Enter loop condition"]; - 145 [label="Const: Boolean(true)"]; - 146 [label="Exit loop condition"]; + 146 [label="Enter loop condition"]; + 147 [label="Const: Boolean(true)"]; + 148 [label="Exit loop condition"]; } - 147 [label="Exit do-whileloop"]; + 149 [label="Exit do-whileloop"]; } - 148 [label="Access variable R|/x|"]; - 149 [label="Function call: R|/x|.R|/A.foo|()"]; - 150 [label="Exit function test_5" style="filled" fillcolor=red]; + 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]; } - 124 -> {125}; - 125 -> {126}; 126 -> {127}; 127 -> {128}; 128 -> {129}; 129 -> {130}; 130 -> {131}; - 131 -> {133 132}; - 132 -> {141}; - 133 -> {134}; - 134 -> {135}; + 131 -> {132}; + 132 -> {133}; + 133 -> {135 134}; + 134 -> {143}; 135 -> {136}; 136 -> {137}; - 137 -> {147}; - 137 -> {138} [style=dotted]; - 138 -> {139} [style=dotted]; + 137 -> {138}; + 138 -> {139}; + 139 -> {149}; 139 -> {140} [style=dotted]; 140 -> {141} [style=dotted]; - 141 -> {142}; - 142 -> {143}; + 141 -> {142} [style=dotted]; + 142 -> {143} [style=dotted]; 143 -> {144}; 144 -> {145}; 145 -> {146}; - 146 -> {126}; - 146 -> {147} [style=dotted]; + 146 -> {147}; 147 -> {148}; - 148 -> {149}; + 148 -> {128}; + 148 -> {149} [style=dotted]; 149 -> {150}; + 150 -> {151}; + 151 -> {152}; - subgraph cluster_44 { + subgraph cluster_45 { color=red - 151 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_45 { + 153 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_46 { color=blue - 152 [label="Enter do-while loop"]; - subgraph cluster_46 { + 154 [label="Enter do-while loop"]; + subgraph cluster_47 { color=blue - 153 [label="Enter loop block"]; - subgraph cluster_47 { + 155 [label="Enter loop block"]; + subgraph cluster_48 { color=blue - 154 [label="Enter block"]; - 155 [label="Access variable R|/x|"]; - 156 [label="Type operator: (R|/x| as R|A|)"]; - subgraph cluster_48 { + 156 [label="Enter block"]; + 157 [label="Access variable R|/x|"]; + 158 [label="Type operator: (R|/x| as R|A|)"]; + subgraph cluster_49 { color=blue - 157 [label="Enter when"]; - subgraph cluster_49 { - color=blue - 158 [label="Enter when branch condition "]; - 159 [label="Access variable R|/b|"]; - 160 [label="Exit when branch condition"]; - } - 161 [label="Synthetic else branch"]; - 162 [label="Enter when branch result"]; + 159 [label="Enter when"]; subgraph cluster_50 { color=blue - 163 [label="Enter block"]; - 164 [label="Jump: break@@@[Boolean(true)] "]; - 165 [label="Stub" style="filled" fillcolor=gray]; - 166 [label="Exit block" style="filled" fillcolor=gray]; + 160 [label="Enter when branch condition "]; + 161 [label="Access variable R|/b|"]; + 162 [label="Exit when branch condition"]; } - 167 [label="Exit when branch result" style="filled" fillcolor=gray]; - 168 [label="Exit when"]; + 163 [label="Synthetic else branch"]; + 164 [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]; + } + 169 [label="Exit when branch result" style="filled" fillcolor=gray]; + 170 [label="Exit when"]; } - 169 [label="Exit block"]; + 171 [label="Exit block"]; } - 170 [label="Exit loop block"]; + 172 [label="Exit loop block"]; } - subgraph cluster_51 { + subgraph cluster_52 { color=blue - 171 [label="Enter loop condition"]; - 172 [label="Const: Boolean(true)"]; - 173 [label="Exit loop condition"]; + 173 [label="Enter loop condition"]; + 174 [label="Const: Boolean(true)"]; + 175 [label="Exit loop condition"]; } - 174 [label="Exit do-whileloop"]; + 176 [label="Exit do-whileloop"]; } - 175 [label="Access variable R|/x|"]; - 176 [label="Function call: R|/x|.R|/A.foo|()"]; - 177 [label="Exit function test_6" style="filled" fillcolor=red]; + 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]; } - 151 -> {152}; - 152 -> {153}; 153 -> {154}; 154 -> {155}; 155 -> {156}; @@ -516,59 +522,59 @@ digraph endlessLoops_kt { 157 -> {158}; 158 -> {159}; 159 -> {160}; - 160 -> {162 161}; - 161 -> {168}; - 162 -> {163}; - 163 -> {164}; - 164 -> {174}; - 164 -> {165} [style=dotted]; - 165 -> {166} [style=dotted]; + 160 -> {161}; + 161 -> {162}; + 162 -> {164 163}; + 163 -> {170}; + 164 -> {165}; + 165 -> {166}; + 166 -> {176}; 166 -> {167} [style=dotted]; 167 -> {168} [style=dotted]; - 168 -> {169}; - 169 -> {170}; + 168 -> {169} [style=dotted]; + 169 -> {170} [style=dotted]; 170 -> {171}; 171 -> {172}; 172 -> {173}; - 173 -> {153}; - 173 -> {174} [style=dotted]; + 173 -> {174}; 174 -> {175}; - 175 -> {176}; + 175 -> {155}; + 175 -> {176} [style=dotted]; 176 -> {177}; + 177 -> {178}; + 178 -> {179}; - subgraph cluster_52 { + subgraph cluster_53 { color=red - 178 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_53 { + 180 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_54 { color=blue - 179 [label="Enter do-while loop"]; - subgraph cluster_54 { + 181 [label="Enter do-while loop"]; + subgraph cluster_55 { color=blue - 180 [label="Enter loop block"]; - subgraph cluster_55 { + 182 [label="Enter loop block"]; + subgraph cluster_56 { color=blue - 181 [label="Enter block"]; - 182 [label="Access variable R|/x|"]; - 183 [label="Type operator: (R|/x| as R|A|)"]; - 184 [label="Exit block"]; + 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="Exit loop block"]; + 187 [label="Exit loop block"]; } - subgraph cluster_56 { + subgraph cluster_57 { color=blue - 186 [label="Enter loop condition"]; - 187 [label="Const: Boolean(true)"]; - 188 [label="Exit loop condition"]; + 188 [label="Enter loop condition"]; + 189 [label="Const: Boolean(true)"]; + 190 [label="Exit loop condition"]; } - 189 [label="Exit do-whileloop" style="filled" fillcolor=gray]; + 191 [label="Exit do-whileloop" style="filled" fillcolor=gray]; } - 190 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 191 [label="Function call: R|/x|.R|/A.foo|()" style="filled" fillcolor=gray]; - 192 [label="Exit function test_7" style="filled" fillcolor=red 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]; } - 178 -> {179}; - 179 -> {180}; 180 -> {181}; 181 -> {182}; 182 -> {183}; @@ -577,10 +583,12 @@ digraph endlessLoops_kt { 185 -> {186}; 186 -> {187}; 187 -> {188}; - 188 -> {180}; - 188 -> {189} [style=dotted]; - 189 -> {190} [style=dotted]; + 188 -> {189}; + 189 -> {190}; + 190 -> {182}; 190 -> {191} [style=dotted]; 191 -> {192} [style=dotted]; + 192 -> {193} [style=dotted]; + 193 -> {194} [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 b21913f97bc..eccb2ef1fc6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot @@ -13,49 +13,61 @@ digraph multipleCasts_kt { subgraph cluster_1 { color=red - 2 [label="Enter function foo" style="filled" fillcolor=red]; - 3 [label="Exit function foo" style="filled" fillcolor=red]; + 2 [label="Enter class A" style="filled" fillcolor=red]; + 3 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3}; + 2 -> {3} [color=green]; subgraph cluster_2 { color=red - 4 [label="Enter function getAny" style="filled" fillcolor=red]; - 5 [label="Const: Null(null)"]; - 6 [label="Jump: ^getAny Null(null)"]; - 7 [label="Stub" style="filled" fillcolor=gray]; - 8 [label="Exit function getAny" style="filled" fillcolor=red]; + 4 [label="Enter function foo" style="filled" fillcolor=red]; + 5 [label="Exit function foo" style="filled" fillcolor=red]; } 4 -> {5}; - 5 -> {6}; - 6 -> {8}; - 6 -> {7} [style=dotted]; - 7 -> {8} [style=dotted]; subgraph cluster_3 { color=red - 9 [label="Enter function test_0" style="filled" fillcolor=red]; - 10 [label="Function call: R|/getAny|()"]; - 11 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 12 [label="Function call: R|/getAny|()"]; - 13 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - 14 [label="Access variable R|/a|"]; - 15 [label="Type operator: (R|/a| as R|A|)"]; - 16 [label="Access variable R|/a|"]; - 17 [label="Function call: R|/a|.R|/A.foo|()"]; - 18 [label="Access variable R|/b|"]; - 19 [label="Type operator: (R|/b| as R|B|)"]; - 20 [label="Access variable R|/b|"]; - 21 [label="Function call: R|/b|.R|/B.foo|()"]; - 22 [label="Exit function test_0" style="filled" fillcolor=red]; + 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]; + } + + 8 -> {9}; 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {13}; + 10 -> {12}; + 10 -> {11} [style=dotted]; + 11 -> {12} [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]; + } + 13 -> {14}; 14 -> {15}; 15 -> {16}; @@ -65,75 +77,79 @@ digraph multipleCasts_kt { 19 -> {20}; 20 -> {21}; 21 -> {22}; - - subgraph cluster_4 { - color=red - 23 [label="Enter function test_1" style="filled" fillcolor=red]; - 24 [label="Function call: R|/getAny|()"]; - 25 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 26 [label="Function call: R|/getAny|()"]; - 27 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - subgraph cluster_5 { - color=blue - 28 [label="Enter when"]; - subgraph cluster_6 { - color=blue - 29 [label="Enter when branch condition "]; - subgraph cluster_7 { - color=blue - 30 [label="Enter &&"]; - 31 [label="Access variable R|/a|"]; - 32 [label="Type operator: (R|/a| is R|A|)"]; - 33 [label="Exit left part of &&"]; - 34 [label="Enter right part of &&"]; - 35 [label="Access variable R|/b|"]; - 36 [label="Type operator: (R|/b| is R|B|)"]; - 37 [label="Exit &&"]; - } - 38 [label="Exit when branch condition"]; - } - 39 [label="Synthetic else branch"]; - 40 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 41 [label="Enter block"]; - 42 [label="Access variable R|/a|"]; - 43 [label="Function call: R|/a|.R|/A.foo|()"]; - 44 [label="Access variable R|/b|"]; - 45 [label="Function call: R|/b|.R|/B.foo|()"]; - 46 [label="Exit block"]; - } - 47 [label="Exit when branch result"]; - 48 [label="Exit when"]; - } - 49 [label="Exit function test_1" style="filled" fillcolor=red]; - } - + 22 -> {23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; - 26 -> {27}; + + 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?|"]; + subgraph cluster_7 { + color=blue + 32 [label="Enter when"]; + subgraph cluster_8 { + color=blue + 33 [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 &&"]; + } + 42 [label="Exit when branch condition"]; + } + 43 [label="Synthetic else branch"]; + 44 [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"]; + } + 51 [label="Exit when branch result"]; + 52 [label="Exit when"]; + } + 53 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; - 33 -> {37 34}; + 33 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {38}; - 38 -> {40 39}; - 39 -> {48}; + 37 -> {41 38}; + 38 -> {39}; + 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {43}; - 43 -> {44}; + 42 -> {44 43}; + 43 -> {52}; 44 -> {45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; 48 -> {49}; + 49 -> {50}; + 50 -> {51}; + 51 -> {52}; + 52 -> {53}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot index 22cd46978c6..5538bdc64f5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot @@ -21,163 +21,167 @@ digraph nullability_kt { subgraph cluster_2 { color=red - 4 [label="Enter function getter" style="filled" fillcolor=red]; - 5 [label="Exit function getter" style="filled" fillcolor=red]; + 4 [label="Enter class A" style="filled" fillcolor=red]; + 5 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5}; + 4 -> {5} [color=green]; subgraph cluster_3 { color=red - 6 [label="Enter property" style="filled" fillcolor=red]; - 7 [label="Exit property" style="filled" fillcolor=red]; + 6 [label="Enter function getter" style="filled" fillcolor=red]; + 7 [label="Exit function getter" style="filled" fillcolor=red]; } 6 -> {7}; subgraph cluster_4 { color=red - 8 [label="Enter function fs" style="filled" fillcolor=red]; - 9 [label="Exit function fs" style="filled" fillcolor=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 [label="Enter function fs" style="filled" fillcolor=red]; + 11 [label="Exit function fs" 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 [label="Enter class MyData" style="filled" fillcolor=red]; + 13 [label="Exit class MyData" style="filled" fillcolor=red]; } - 12 -> {13}; subgraph cluster_7 { color=red - 14 [label="Enter function fdata" style="filled" fillcolor=red]; - 15 [label="Exit function fdata" style="filled" fillcolor=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 function " style="filled" fillcolor=red]; - 17 [label="Delegated constructor call: super()"]; - 18 [label="Exit function " style="filled" fillcolor=red]; + 16 [label="Enter property" style="filled" fillcolor=red]; + 17 [label="Exit property" style="filled" fillcolor=red]; } 16 -> {17}; - 17 -> {18}; subgraph cluster_9 { color=red - 19 [label="Enter function getter" style="filled" fillcolor=red]; - 20 [label="Exit function getter" style="filled" fillcolor=red]; + 18 [label="Enter function fdata" style="filled" fillcolor=red]; + 19 [label="Exit function fdata" style="filled" fillcolor=red]; } - 19 -> {20}; + 18 -> {19}; subgraph cluster_10 { color=red - 21 [label="Enter property" style="filled" fillcolor=red]; - 22 [label="Access variable R|/data|"]; - 23 [label="Exit property" style="filled" fillcolor=red]; + 20 [label="Enter class Q" style="filled" fillcolor=red]; + 21 [label="Exit class Q" style="filled" fillcolor=red]; } - 21 -> {22}; - 22 -> {23}; subgraph cluster_11 { color=red - 24 [label="Enter function fdata" style="filled" fillcolor=red]; - 25 [label="Const: Null(null)"]; - 26 [label="Jump: ^fdata Null(null)"]; - 27 [label="Stub" style="filled" fillcolor=gray]; - 28 [label="Exit function fdata" style="filled" fillcolor=red]; + 22 [label="Enter function " style="filled" fillcolor=red]; + 23 [label="Delegated constructor call: super()"]; + 24 [label="Exit function " style="filled" fillcolor=red]; } - 24 -> {25}; - 25 -> {26}; - 26 -> {28}; - 26 -> {27} [style=dotted]; - 27 -> {28} [style=dotted]; + 22 -> {23}; + 23 -> {24}; subgraph cluster_12 { color=red - 29 [label="Enter function " style="filled" fillcolor=red]; - 30 [label="Delegated constructor call: super()"]; - 31 [label="Exit function " style="filled" fillcolor=red]; + 25 [label="Enter function getter" style="filled" fillcolor=red]; + 26 [label="Exit function getter" style="filled" fillcolor=red]; } - 29 -> {30}; - 30 -> {31}; + 25 -> {26}; subgraph cluster_13 { color=red - 32 [label="Enter function getter" style="filled" fillcolor=red]; - 33 [label="Exit function getter" style="filled" fillcolor=red]; + 27 [label="Enter property" style="filled" fillcolor=red]; + 28 [label="Access variable R|/data|"]; + 29 [label="Exit property" style="filled" fillcolor=red]; } - 32 -> {33}; + 27 -> {28}; + 28 -> {29}; subgraph cluster_14 { color=red - 34 [label="Enter function setter" style="filled" fillcolor=red]; - 35 [label="Exit function setter" style="filled" fillcolor=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]; } - 34 -> {35}; + 30 -> {31}; + 31 -> {32}; + 32 -> {34}; + 32 -> {33} [style=dotted]; + 33 -> {34} [style=dotted]; subgraph cluster_15 { color=red - 36 [label="Enter property" style="filled" fillcolor=red]; - 37 [label="Access variable R|/data|"]; - 38 [label="Exit property" style="filled" fillcolor=red]; + 35 [label="Enter class QImpl" style="filled" fillcolor=red]; + 36 [label="Exit class QImpl" style="filled" fillcolor=red]; } - 36 -> {37}; - 37 -> {38}; subgraph cluster_16 { color=red - 39 [label="Enter function fdata" style="filled" fillcolor=red]; - 40 [label="Const: Null(null)"]; - 41 [label="Jump: ^fdata Null(null)"]; - 42 [label="Stub" style="filled" fillcolor=gray]; - 43 [label="Exit function fdata" style="filled" fillcolor=red]; + 37 [label="Enter function " style="filled" fillcolor=red]; + 38 [label="Delegated constructor call: super()"]; + 39 [label="Exit function " style="filled" fillcolor=red]; } - 39 -> {40}; - 40 -> {41}; - 41 -> {43}; - 41 -> {42} [style=dotted]; - 42 -> {43} [style=dotted]; + 37 -> {38}; + 38 -> {39}; subgraph cluster_17 { color=red - 44 [label="Enter function " style="filled" fillcolor=red]; - 45 [label="Delegated constructor call: super()"]; - 46 [label="Exit function " style="filled" fillcolor=red]; + 40 [label="Enter function getter" style="filled" fillcolor=red]; + 41 [label="Exit function getter" style="filled" fillcolor=red]; + } + + 40 -> {41}; + + subgraph cluster_18 { + color=red + 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_18 { + subgraph cluster_20 { color=red - 47 [label="Enter function getter" style="filled" fillcolor=red]; + 47 [label="Enter function fdata" style="filled" fillcolor=red]; 48 [label="Const: Null(null)"]; - 49 [label="Jump: ^ Null(null)"]; + 49 [label="Jump: ^fdata Null(null)"]; 50 [label="Stub" style="filled" fillcolor=gray]; - 51 [label="Exit function getter" style="filled" fillcolor=red]; + 51 [label="Exit function fdata" style="filled" fillcolor=red]; } 47 -> {48}; @@ -186,724 +190,751 @@ digraph nullability_kt { 49 -> {50} [style=dotted]; 50 -> {51} [style=dotted]; - subgraph cluster_19 { + subgraph cluster_21 { color=red - 52 [label="Enter property" style="filled" fillcolor=red]; - 53 [label="Exit property" style="filled" fillcolor=red]; + 52 [label="Enter class QImplMutable" style="filled" fillcolor=red]; + 53 [label="Exit class QImplMutable" style="filled" fillcolor=red]; } - 52 -> {53}; - subgraph cluster_20 { + subgraph cluster_22 { color=red - 54 [label="Enter function fdata" style="filled" fillcolor=red]; - 55 [label="Const: Null(null)"]; - 56 [label="Jump: ^fdata Null(null)"]; - 57 [label="Stub" style="filled" fillcolor=gray]; - 58 [label="Exit function fdata" style="filled" fillcolor=red]; + 54 [label="Enter function " style="filled" fillcolor=red]; + 55 [label="Delegated constructor call: super()"]; + 56 [label="Exit function " style="filled" fillcolor=red]; } 54 -> {55}; 55 -> {56}; - 56 -> {58}; - 56 -> {57} [style=dotted]; - 57 -> {58} [style=dotted]; - subgraph cluster_21 { + subgraph cluster_23 { color=red - 59 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_22 { - color=blue - 60 [label="Enter when"]; - subgraph cluster_23 { - color=blue - 61 [label="Enter when branch condition "]; - 62 [label="Access variable R|/x|"]; - 63 [label="Const: Null(null)"]; - 64 [label="Operator !="]; - 65 [label="Exit when branch condition"]; - } - subgraph cluster_24 { - color=blue - 66 [label="Enter when branch condition else"]; - 67 [label="Exit when branch condition"]; - } - 68 [label="Enter when branch result"]; - subgraph cluster_25 { - color=blue - 69 [label="Enter block"]; - 70 [label="Access variable R|/x|"]; - 71 [label="Function call: R|/x|.#()"]; - 72 [label="Exit block"]; - } - 73 [label="Exit when branch result"]; - 74 [label="Enter when branch result"]; - subgraph cluster_26 { - color=blue - 75 [label="Enter block"]; - 76 [label="Access variable R|/x|"]; - 77 [label="Function call: R|/x|.R|/A.foo|()"]; - 78 [label="Exit block"]; - } - 79 [label="Exit when branch result"]; - 80 [label="Exit when"]; - } - 81 [label="Access variable R|/x|"]; - 82 [label="Function call: R|/x|.#()"]; - 83 [label="Exit function test_1" style="filled" fillcolor=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]; + } + + 57 -> {58}; + 58 -> {59}; + 59 -> {61}; + 59 -> {60} [style=dotted]; + 60 -> {61} [style=dotted]; + + subgraph cluster_24 { + color=red + 62 [label="Enter property" style="filled" fillcolor=red]; + 63 [label="Exit property" style="filled" fillcolor=red]; } - 59 -> {60}; - 60 -> {61}; - 61 -> {62}; 62 -> {63}; - 63 -> {64}; + + 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]; + } + 64 -> {65}; - 65 -> {74 66}; - 66 -> {67}; - 67 -> {68}; - 68 -> {69}; - 69 -> {70}; - 70 -> {71}; + 65 -> {66}; + 66 -> {68}; + 66 -> {67} [style=dotted]; + 67 -> {68} [style=dotted]; + + subgraph cluster_26 { + color=red + 69 [label="Enter class QImplWithCustomGetter" style="filled" fillcolor=red]; + 70 [label="Exit class QImplWithCustomGetter" style="filled" fillcolor=red]; + } + + + subgraph cluster_27 { + color=red + 71 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_28 { + color=blue + 72 [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"]; + } + subgraph cluster_30 { + color=blue + 78 [label="Enter when branch condition else"]; + 79 [label="Exit when branch condition"]; + } + 80 [label="Enter when branch result"]; + subgraph cluster_31 { + color=blue + 81 [label="Enter block"]; + 82 [label="Access variable R|/x|"]; + 83 [label="Function call: R|/x|.#()"]; + 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"]; + } + 93 [label="Access variable R|/x|"]; + 94 [label="Function call: R|/x|.#()"]; + 95 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 71 -> {72}; 72 -> {73}; - 73 -> {80}; + 73 -> {74}; 74 -> {75}; 75 -> {76}; 76 -> {77}; - 77 -> {78}; + 77 -> {86 78}; 78 -> {79}; 79 -> {80}; 80 -> {81}; 81 -> {82}; 82 -> {83}; - - subgraph cluster_27 { - color=red - 84 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_28 { - color=blue - 85 [label="Enter when"]; - subgraph cluster_29 { - color=blue - 86 [label="Enter when branch condition "]; - 87 [label="Access variable R|/x|"]; - 88 [label="Const: Null(null)"]; - 89 [label="Operator =="]; - 90 [label="Exit when branch condition"]; - } - subgraph cluster_30 { - color=blue - 91 [label="Enter when branch condition else"]; - 92 [label="Exit when branch condition"]; - } - 93 [label="Enter when branch result"]; - subgraph cluster_31 { - 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"]; - } - 98 [label="Exit when branch result"]; - 99 [label="Enter when branch result"]; - subgraph cluster_32 { - color=blue - 100 [label="Enter block"]; - 101 [label="Access variable R|/x|"]; - 102 [label="Function call: R|/x|.#()"]; - 103 [label="Exit block"]; - } - 104 [label="Exit when branch result"]; - 105 [label="Exit when"]; - } - 106 [label="Access variable R|/x|"]; - 107 [label="Function call: R|/x|.#()"]; - 108 [label="Exit function test_2" style="filled" fillcolor=red]; - } - + 83 -> {84}; 84 -> {85}; - 85 -> {86}; + 85 -> {92}; 86 -> {87}; 87 -> {88}; 88 -> {89}; 89 -> {90}; - 90 -> {99 91}; + 90 -> {91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; 94 -> {95}; - 95 -> {96}; + + subgraph cluster_33 { + color=red + 96 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_34 { + color=blue + 97 [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"]; + } + subgraph cluster_36 { + color=blue + 103 [label="Enter when branch condition else"]; + 104 [label="Exit when branch condition"]; + } + 105 [label="Enter when branch result"]; + subgraph cluster_37 { + color=blue + 106 [label="Enter block"]; + 107 [label="Access variable R|/x|"]; + 108 [label="Function call: R|/x|.R|/A.foo|()"]; + 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"]; + } + 118 [label="Access variable R|/x|"]; + 119 [label="Function call: R|/x|.#()"]; + 120 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 96 -> {97}; 97 -> {98}; - 98 -> {105}; + 98 -> {99}; 99 -> {100}; 100 -> {101}; 101 -> {102}; - 102 -> {103}; + 102 -> {111 103}; 103 -> {104}; 104 -> {105}; 105 -> {106}; 106 -> {107}; 107 -> {108}; - - subgraph cluster_33 { - color=red - 109 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_34 { - color=blue - 110 [label="Enter when"]; - 111 [label="Access variable R|/x|"]; - 112 [label="Variable declaration: lval : R|A?|"]; - subgraph cluster_35 { - color=blue - 113 [label="Enter when branch condition "]; - 114 [label="Const: Null(null)"]; - 115 [label="Operator =="]; - 116 [label="Exit when branch condition"]; - } - subgraph cluster_36 { - color=blue - 117 [label="Enter when branch condition else"]; - 118 [label="Exit when branch condition"]; - } - 119 [label="Enter when branch result"]; - subgraph cluster_37 { - color=blue - 120 [label="Enter block"]; - 121 [label="Access variable R|/|"]; - 122 [label="Exit block"]; - } - 123 [label="Exit when branch result"]; - 124 [label="Enter when branch result"]; - subgraph cluster_38 { - color=blue - 125 [label="Enter block"]; - 126 [label="Jump: ^test_3 Unit"]; - 127 [label="Stub" style="filled" fillcolor=gray]; - 128 [label="Exit block" style="filled" fillcolor=gray]; - } - 129 [label="Exit when branch result" style="filled" fillcolor=gray]; - 130 [label="Exit when"]; - } - 131 [label="Access variable R|/x|"]; - 132 [label="Function call: R|/x|.R|/A.foo|()"]; - 133 [label="Exit function test_3" style="filled" fillcolor=red]; - } - + 108 -> {109}; 109 -> {110}; - 110 -> {111}; + 110 -> {117}; 111 -> {112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; - 116 -> {124 117}; + 116 -> {117}; 117 -> {118}; 118 -> {119}; 119 -> {120}; - 120 -> {121}; - 121 -> {122}; - 122 -> {123}; - 123 -> {130}; - 124 -> {125}; - 125 -> {126}; - 126 -> {133}; - 126 -> {127} [style=dotted]; - 127 -> {128} [style=dotted]; - 128 -> {129} [style=dotted]; - 129 -> {130} [style=dotted]; - 130 -> {131}; - 131 -> {132}; - 132 -> {133}; subgraph cluster_39 { color=red - 134 [label="Enter function test_4" style="filled" fillcolor=red]; + 121 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_40 { color=blue - 135 [label="Enter when"]; + 122 [label="Enter when"]; + 123 [label="Access variable R|/x|"]; + 124 [label="Variable declaration: lval : R|A?|"]; subgraph cluster_41 { color=blue - 136 [label="Enter when branch condition "]; - 137 [label="Access variable R|/x|"]; - 138 [label="Enter safe call"]; - 139 [label="Function call: R|/x|?.R|/A.getA|()"]; - 140 [label="Exit safe call"]; - 141 [label="Const: Null(null)"]; - 142 [label="Operator =="]; - 143 [label="Exit when branch condition"]; + 125 [label="Enter when branch condition "]; + 126 [label="Const: Null(null)"]; + 127 [label="Operator =="]; + 128 [label="Exit when branch condition"]; } - 144 [label="Synthetic else branch"]; - 145 [label="Enter when branch result"]; subgraph cluster_42 { color=blue - 146 [label="Enter block"]; - 147 [label="Jump: ^test_4 Unit"]; - 148 [label="Stub" style="filled" fillcolor=gray]; - 149 [label="Exit block" style="filled" fillcolor=gray]; + 129 [label="Enter when branch condition else"]; + 130 [label="Exit when branch condition"]; } - 150 [label="Exit when branch result" style="filled" fillcolor=gray]; - 151 [label="Exit when"]; + 131 [label="Enter when branch result"]; + subgraph cluster_43 { + color=blue + 132 [label="Enter block"]; + 133 [label="Access variable R|/|"]; + 134 [label="Exit block"]; + } + 135 [label="Exit when branch result"]; + 136 [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]; + } + 141 [label="Exit when branch result" style="filled" fillcolor=gray]; + 142 [label="Exit when"]; } - 152 [label="Access variable R|/x|"]; - 153 [label="Function call: R|/x|.R|/A.foo|()"]; - 154 [label="Exit function test_4" style="filled" fillcolor=red]; + 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]; } + 121 -> {122}; + 122 -> {123}; + 123 -> {124}; + 124 -> {125}; + 125 -> {126}; + 126 -> {127}; + 127 -> {128}; + 128 -> {136 129}; + 129 -> {130}; + 130 -> {131}; + 131 -> {132}; + 132 -> {133}; + 133 -> {134}; 134 -> {135}; - 135 -> {136}; + 135 -> {142}; 136 -> {137}; - 137 -> {138 140}; - 138 -> {139}; - 139 -> {140}; - 140 -> {141}; - 141 -> {142}; + 137 -> {138}; + 138 -> {145}; + 138 -> {139} [style=dotted]; + 139 -> {140} [style=dotted]; + 140 -> {141} [style=dotted]; + 141 -> {142} [style=dotted]; 142 -> {143}; - 143 -> {145 144}; - 144 -> {151}; - 145 -> {146}; + 143 -> {144}; + 144 -> {145}; + + subgraph cluster_45 { + color=red + 146 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_46 { + color=blue + 147 [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"]; + } + 156 [label="Synthetic else branch"]; + 157 [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]; + } + 162 [label="Exit when branch result" style="filled" fillcolor=gray]; + 163 [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]; + } + 146 -> {147}; - 147 -> {154}; - 147 -> {148} [style=dotted]; - 148 -> {149} [style=dotted]; - 149 -> {150} [style=dotted]; - 150 -> {151} [style=dotted]; + 147 -> {148}; + 148 -> {149}; + 149 -> {150 152}; + 150 -> {151}; 151 -> {152}; 152 -> {153}; 153 -> {154}; + 154 -> {155}; + 155 -> {157 156}; + 156 -> {163}; + 157 -> {158}; + 158 -> {159}; + 159 -> {166}; + 159 -> {160} [style=dotted]; + 160 -> {161} [style=dotted]; + 161 -> {162} [style=dotted]; + 162 -> {163} [style=dotted]; + 163 -> {164}; + 164 -> {165}; + 165 -> {166}; - subgraph cluster_43 { + subgraph cluster_49 { color=red - 155 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_44 { + 167 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_50 { color=blue - 156 [label="Enter when"]; - subgraph cluster_45 { + 168 [label="Enter when"]; + subgraph cluster_51 { color=blue - 157 [label="Enter when branch condition "]; - 158 [label="Access variable R|/q|"]; - 159 [label="Enter safe call"]; - 160 [label="Access variable R|/Q.data|"]; - 161 [label="Exit safe call"]; - 162 [label="Enter safe call"]; - 163 [label="Access variable R|/MyData.s|"]; - 164 [label="Exit safe call"]; - 165 [label="Enter safe call"]; - 166 [label="Function call: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 167 [label="Exit safe call"]; - 168 [label="Const: Null(null)"]; - 169 [label="Operator !="]; - 170 [label="Exit when branch condition"]; + 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="Synthetic else branch"]; - 172 [label="Enter when branch result"]; - subgraph cluster_46 { + 183 [label="Synthetic else branch"]; + 184 [label="Enter when branch result"]; + subgraph cluster_52 { color=blue - 173 [label="Enter block"]; - 174 [label="Access variable R|/q|"]; - 175 [label="Access variable R|/Q.data|"]; - 176 [label="Access variable R|/q|"]; - 177 [label="Access variable R|/Q.data|"]; - 178 [label="Access variable #"]; - 179 [label="Access variable R|/q|"]; - 180 [label="Access variable R|/Q.data|"]; - 181 [label="Access variable #"]; - 182 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; - 183 [label="Exit block"]; + 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"]; } - 184 [label="Exit when branch result"]; - 185 [label="Exit when"]; + 196 [label="Exit when branch result"]; + 197 [label="Exit when"]; } - 186 [label="Exit function test_5" style="filled" fillcolor=red]; + 198 [label="Exit function test_5" style="filled" fillcolor=red]; } - 155 -> {156}; - 156 -> {157}; - 157 -> {158}; - 158 -> {159 161}; - 159 -> {160}; - 160 -> {161}; - 161 -> {162 164}; - 162 -> {163}; - 163 -> {164}; - 164 -> {165 167}; - 165 -> {166}; - 166 -> {167}; 167 -> {168}; 168 -> {169}; 169 -> {170}; - 170 -> {172 171}; - 171 -> {185}; + 170 -> {171 173}; + 171 -> {172}; 172 -> {173}; - 173 -> {174}; + 173 -> {174 176}; 174 -> {175}; 175 -> {176}; - 176 -> {177}; + 176 -> {177 179}; 177 -> {178}; 178 -> {179}; 179 -> {180}; 180 -> {181}; 181 -> {182}; - 182 -> {183}; - 183 -> {184}; + 182 -> {184 183}; + 183 -> {197}; 184 -> {185}; 185 -> {186}; - - subgraph cluster_47 { - color=red - 187 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_48 { - color=blue - 188 [label="Enter when"]; - 189 [label="Access variable R|/q|"]; - 190 [label="Enter safe call"]; - 191 [label="Access variable R|/Q.data|"]; - 192 [label="Exit safe call"]; - 193 [label="Enter safe call"]; - 194 [label="Access variable R|/MyData.s|"]; - 195 [label="Exit safe call"]; - 196 [label="Enter safe call"]; - 197 [label="Function call: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 198 [label="Exit safe call"]; - 199 [label="Variable declaration: lval : R|kotlin/Int?|"]; - subgraph cluster_49 { - color=blue - 200 [label="Enter when branch condition "]; - 201 [label="Const: Null(null)"]; - 202 [label="Operator =="]; - 203 [label="Exit when branch condition"]; - } - subgraph cluster_50 { - color=blue - 204 [label="Enter when branch condition else"]; - 205 [label="Exit when branch condition"]; - } - 206 [label="Enter when branch result"]; - subgraph cluster_51 { - color=blue - 207 [label="Enter block"]; - 208 [label="Access variable R|/|"]; - 209 [label="Exit block"]; - } - 210 [label="Exit when branch result"]; - 211 [label="Enter when branch result"]; - subgraph cluster_52 { - color=blue - 212 [label="Enter block"]; - 213 [label="Jump: ^test_6 Unit"]; - 214 [label="Stub" style="filled" fillcolor=gray]; - 215 [label="Exit block" style="filled" fillcolor=gray]; - } - 216 [label="Exit when branch result" style="filled" fillcolor=gray]; - 217 [label="Exit when"]; - } - 218 [label="Access variable R|/q|"]; - 219 [label="Access variable R|/Q.data|"]; - 220 [label="Access variable R|/q|"]; - 221 [label="Access variable R|/Q.data|"]; - 222 [label="Access variable #"]; - 223 [label="Access variable R|/q|"]; - 224 [label="Access variable R|/Q.data|"]; - 225 [label="Access variable #"]; - 226 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; - 227 [label="Exit function test_6" style="filled" fillcolor=red]; - } - + 186 -> {187}; 187 -> {188}; 188 -> {189}; - 189 -> {190 192}; + 189 -> {190}; 190 -> {191}; 191 -> {192}; - 192 -> {193 195}; + 192 -> {193}; 193 -> {194}; 194 -> {195}; - 195 -> {196 198}; + 195 -> {196}; 196 -> {197}; 197 -> {198}; - 198 -> {199}; + + 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?|"]; + 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"]; + } + subgraph cluster_56 { + color=blue + 216 [label="Enter when branch condition else"]; + 217 [label="Exit when branch condition"]; + } + 218 [label="Enter when branch result"]; + subgraph cluster_57 { + color=blue + 219 [label="Enter block"]; + 220 [label="Access variable R|/|"]; + 221 [label="Exit block"]; + } + 222 [label="Exit when branch result"]; + 223 [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]; + } + 228 [label="Exit when branch result" style="filled" fillcolor=gray]; + 229 [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]; + } + 199 -> {200}; 200 -> {201}; - 201 -> {202}; + 201 -> {202 204}; 202 -> {203}; - 203 -> {211 204}; - 204 -> {205}; + 203 -> {204}; + 204 -> {205 207}; 205 -> {206}; 206 -> {207}; - 207 -> {208}; + 207 -> {208 210}; 208 -> {209}; 209 -> {210}; - 210 -> {217}; + 210 -> {211}; 211 -> {212}; 212 -> {213}; - 213 -> {227}; - 213 -> {214} [style=dotted]; - 214 -> {215} [style=dotted]; - 215 -> {216} [style=dotted]; - 216 -> {217} [style=dotted]; + 213 -> {214}; + 214 -> {215}; + 215 -> {223 216}; + 216 -> {217}; 217 -> {218}; 218 -> {219}; 219 -> {220}; 220 -> {221}; 221 -> {222}; - 222 -> {223}; + 222 -> {229}; 223 -> {224}; 224 -> {225}; - 225 -> {226}; - 226 -> {227}; - - subgraph cluster_53 { - color=red - 228 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_54 { - color=blue - 229 [label="Enter when"]; - subgraph cluster_55 { - color=blue - 230 [label="Enter when branch condition "]; - 231 [label="Access variable R|/q|"]; - 232 [label="Enter safe call"]; - 233 [label="Function call: R|/q|?.R|/Q.fdata|()"]; - 234 [label="Exit safe call"]; - 235 [label="Enter safe call"]; - 236 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()"]; - 237 [label="Exit safe call"]; - 238 [label="Enter safe call"]; - 239 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()?.R|kotlin/Int.inc|()"]; - 240 [label="Exit safe call"]; - 241 [label="Const: Null(null)"]; - 242 [label="Operator !="]; - 243 [label="Exit when branch condition"]; - } - 244 [label="Synthetic else branch"]; - 245 [label="Enter when branch result"]; - subgraph cluster_56 { - color=blue - 246 [label="Enter block"]; - 247 [label="Access variable R|/q|"]; - 248 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 249 [label="Access variable R|/q|"]; - 250 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 251 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; - 252 [label="Access variable R|/q|"]; - 253 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 254 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; - 255 [label="Function call: R|/q|.R|/Q.fdata|().#().#()"]; - 256 [label="Exit block"]; - } - 257 [label="Exit when branch result"]; - 258 [label="Exit when"]; - } - 259 [label="Exit function test_7" style="filled" fillcolor=red]; - } - - 228 -> {229}; + 225 -> {239}; + 225 -> {226} [style=dotted]; + 226 -> {227} [style=dotted]; + 227 -> {228} [style=dotted]; + 228 -> {229} [style=dotted]; 229 -> {230}; 230 -> {231}; - 231 -> {232 234}; + 231 -> {232}; 232 -> {233}; 233 -> {234}; - 234 -> {235 237}; + 234 -> {235}; 235 -> {236}; 236 -> {237}; - 237 -> {238 240}; + 237 -> {238}; 238 -> {239}; - 239 -> {240}; + + subgraph cluster_59 { + color=red + 240 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_60 { + color=blue + 241 [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"]; + } + 256 [label="Synthetic else branch"]; + 257 [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"]; + } + 269 [label="Exit when branch result"]; + 270 [label="Exit when"]; + } + 271 [label="Exit function test_7" style="filled" fillcolor=red]; + } + 240 -> {241}; 241 -> {242}; 242 -> {243}; - 243 -> {245 244}; - 244 -> {258}; + 243 -> {244 246}; + 244 -> {245}; 245 -> {246}; - 246 -> {247}; + 246 -> {247 249}; 247 -> {248}; 248 -> {249}; - 249 -> {250}; + 249 -> {250 252}; 250 -> {251}; 251 -> {252}; 252 -> {253}; 253 -> {254}; 254 -> {255}; - 255 -> {256}; - 256 -> {257}; + 255 -> {257 256}; + 256 -> {270}; 257 -> {258}; 258 -> {259}; - - subgraph cluster_57 { - color=red - 260 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_58 { - color=blue - 261 [label="Enter when"]; - subgraph cluster_59 { - color=blue - 262 [label="Enter when branch condition "]; - 263 [label="Access variable R|/b|"]; - 264 [label="Const: Boolean(true)"]; - 265 [label="Operator =="]; - 266 [label="Exit when branch condition"]; - } - 267 [label="Synthetic else branch"]; - 268 [label="Enter when branch result"]; - subgraph cluster_60 { - color=blue - 269 [label="Enter block"]; - 270 [label="Access variable R|/b|"]; - 271 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 272 [label="Exit block"]; - } - 273 [label="Exit when branch result"]; - 274 [label="Exit when"]; - } - 275 [label="Exit function test_8" style="filled" fillcolor=red]; - } - + 259 -> {260}; 260 -> {261}; 261 -> {262}; 262 -> {263}; 263 -> {264}; 264 -> {265}; 265 -> {266}; - 266 -> {268 267}; - 267 -> {274}; + 266 -> {267}; + 267 -> {268}; 268 -> {269}; 269 -> {270}; 270 -> {271}; - 271 -> {272}; + + subgraph cluster_63 { + color=red + 272 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_64 { + color=blue + 273 [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"]; + } + 279 [label="Synthetic else branch"]; + 280 [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"]; + } + 285 [label="Exit when branch result"]; + 286 [label="Exit when"]; + } + 287 [label="Exit function test_8" style="filled" fillcolor=red]; + } + 272 -> {273}; 273 -> {274}; 274 -> {275}; - - subgraph cluster_61 { - color=red - 276 [label="Enter function test_9" style="filled" fillcolor=red]; - subgraph cluster_62 { - color=blue - 277 [label="Enter when"]; - subgraph cluster_63 { - color=blue - 278 [label="Enter when branch condition "]; - 279 [label="Access variable R|/a|"]; - 280 [label="Access variable R|/b|"]; - 281 [label="Operator =="]; - 282 [label="Exit when branch condition"]; - } - 283 [label="Synthetic else branch"]; - 284 [label="Enter when branch result"]; - subgraph cluster_64 { - color=blue - 285 [label="Enter block"]; - 286 [label="Access variable R|/b|"]; - 287 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 288 [label="Exit block"]; - } - 289 [label="Exit when branch result"]; - 290 [label="Exit when"]; - } - 291 [label="Access variable R|/b|"]; - 292 [label="Function call: R|/b|.#()"]; - subgraph cluster_65 { - color=blue - 293 [label="Enter when"]; - subgraph cluster_66 { - color=blue - 294 [label="Enter when branch condition "]; - 295 [label="Access variable R|/a|"]; - 296 [label="Access variable R|/b|"]; - 297 [label="Operator ==="]; - 298 [label="Exit when branch condition"]; - } - 299 [label="Synthetic else branch"]; - 300 [label="Enter when branch result"]; - subgraph cluster_67 { - color=blue - 301 [label="Enter block"]; - 302 [label="Access variable R|/b|"]; - 303 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 304 [label="Exit block"]; - } - 305 [label="Exit when branch result"]; - 306 [label="Exit when"]; - } - 307 [label="Access variable R|/b|"]; - 308 [label="Function call: R|/b|.#()"]; - subgraph cluster_68 { - color=blue - 309 [label="Enter when"]; - subgraph cluster_69 { - color=blue - 310 [label="Enter when branch condition "]; - 311 [label="Access variable R|/b|"]; - 312 [label="Access variable R|/a|"]; - 313 [label="Operator =="]; - 314 [label="Exit when branch condition"]; - } - 315 [label="Synthetic else branch"]; - 316 [label="Enter when branch result"]; - subgraph cluster_70 { - color=blue - 317 [label="Enter block"]; - 318 [label="Access variable R|/b|"]; - 319 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 320 [label="Exit block"]; - } - 321 [label="Exit when branch result"]; - 322 [label="Exit when"]; - } - 323 [label="Access variable R|/b|"]; - 324 [label="Function call: R|/b|.#()"]; - subgraph cluster_71 { - color=blue - 325 [label="Enter when"]; - subgraph cluster_72 { - color=blue - 326 [label="Enter when branch condition "]; - 327 [label="Access variable R|/b|"]; - 328 [label="Access variable R|/a|"]; - 329 [label="Operator ==="]; - 330 [label="Exit when branch condition"]; - } - 331 [label="Synthetic else branch"]; - 332 [label="Enter when branch result"]; - subgraph cluster_73 { - color=blue - 333 [label="Enter block"]; - 334 [label="Access variable R|/b|"]; - 335 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 336 [label="Exit block"]; - } - 337 [label="Exit when branch result"]; - 338 [label="Exit when"]; - } - 339 [label="Access variable R|/b|"]; - 340 [label="Function call: R|/b|.#()"]; - 341 [label="Exit function test_9" style="filled" fillcolor=red]; - } - + 275 -> {276}; 276 -> {277}; 277 -> {278}; - 278 -> {279}; - 279 -> {280}; + 278 -> {280 279}; + 279 -> {286}; 280 -> {281}; 281 -> {282}; - 282 -> {284 283}; - 283 -> {290}; + 282 -> {283}; + 283 -> {284}; 284 -> {285}; 285 -> {286}; 286 -> {287}; - 287 -> {288}; + + subgraph cluster_67 { + color=red + 288 [label="Enter function test_9" style="filled" fillcolor=red]; + subgraph cluster_68 { + color=blue + 289 [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"]; + } + 295 [label="Synthetic else branch"]; + 296 [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"]; + } + 301 [label="Exit when branch result"]; + 302 [label="Exit when"]; + } + 303 [label="Access variable R|/b|"]; + 304 [label="Function call: R|/b|.#()"]; + subgraph cluster_71 { + color=blue + 305 [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"]; + } + 311 [label="Synthetic else branch"]; + 312 [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"]; + } + 317 [label="Exit when branch result"]; + 318 [label="Exit when"]; + } + 319 [label="Access variable R|/b|"]; + 320 [label="Function call: R|/b|.#()"]; + subgraph cluster_74 { + color=blue + 321 [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"]; + } + 327 [label="Synthetic else branch"]; + 328 [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"]; + } + 333 [label="Exit when branch result"]; + 334 [label="Exit when"]; + } + 335 [label="Access variable R|/b|"]; + 336 [label="Function call: R|/b|.#()"]; + subgraph cluster_77 { + color=blue + 337 [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"]; + } + 343 [label="Synthetic else branch"]; + 344 [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"]; + } + 349 [label="Exit when branch result"]; + 350 [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]; + } + 288 -> {289}; 289 -> {290}; 290 -> {291}; 291 -> {292}; 292 -> {293}; 293 -> {294}; - 294 -> {295}; - 295 -> {296}; + 294 -> {296 295}; + 295 -> {302}; 296 -> {297}; 297 -> {298}; - 298 -> {300 299}; - 299 -> {306}; + 298 -> {299}; + 299 -> {300}; 300 -> {301}; 301 -> {302}; 302 -> {303}; @@ -914,12 +945,12 @@ digraph nullability_kt { 307 -> {308}; 308 -> {309}; 309 -> {310}; - 310 -> {311}; - 311 -> {312}; + 310 -> {312 311}; + 311 -> {318}; 312 -> {313}; 313 -> {314}; - 314 -> {316 315}; - 315 -> {322}; + 314 -> {315}; + 315 -> {316}; 316 -> {317}; 317 -> {318}; 318 -> {319}; @@ -930,12 +961,12 @@ digraph nullability_kt { 323 -> {324}; 324 -> {325}; 325 -> {326}; - 326 -> {327}; - 327 -> {328}; + 326 -> {328 327}; + 327 -> {334}; 328 -> {329}; 329 -> {330}; - 330 -> {332 331}; - 331 -> {338}; + 330 -> {331}; + 331 -> {332}; 332 -> {333}; 333 -> {334}; 334 -> {335}; @@ -945,137 +976,137 @@ digraph nullability_kt { 338 -> {339}; 339 -> {340}; 340 -> {341}; - - subgraph cluster_74 { - color=red - 342 [label="Enter function test_10" style="filled" fillcolor=red]; - subgraph cluster_75 { - color=blue - 343 [label="Enter when"]; - subgraph cluster_76 { - color=blue - 344 [label="Enter when branch condition "]; - 345 [label="Access variable R|/a|"]; - 346 [label="Access variable R|/b|"]; - 347 [label="Operator =="]; - 348 [label="Exit when branch condition"]; - } - 349 [label="Synthetic else branch"]; - 350 [label="Enter when branch result"]; - subgraph cluster_77 { - color=blue - 351 [label="Enter block"]; - 352 [label="Access variable R|/b|"]; - 353 [label="Function call: R|/b|.#()"]; - 354 [label="Exit block"]; - } - 355 [label="Exit when branch result"]; - 356 [label="Exit when"]; - } - 357 [label="Access variable R|/b|"]; - 358 [label="Function call: R|/b|.#()"]; - subgraph cluster_78 { - color=blue - 359 [label="Enter when"]; - subgraph cluster_79 { - color=blue - 360 [label="Enter when branch condition "]; - 361 [label="Access variable R|/a|"]; - 362 [label="Access variable R|/b|"]; - 363 [label="Operator ==="]; - 364 [label="Exit when branch condition"]; - } - 365 [label="Synthetic else branch"]; - 366 [label="Enter when branch result"]; - subgraph cluster_80 { - color=blue - 367 [label="Enter block"]; - 368 [label="Access variable R|/b|"]; - 369 [label="Function call: R|/b|.#()"]; - 370 [label="Exit block"]; - } - 371 [label="Exit when branch result"]; - 372 [label="Exit when"]; - } - 373 [label="Access variable R|/b|"]; - 374 [label="Function call: R|/b|.#()"]; - subgraph cluster_81 { - color=blue - 375 [label="Enter when"]; - subgraph cluster_82 { - color=blue - 376 [label="Enter when branch condition "]; - 377 [label="Access variable R|/b|"]; - 378 [label="Access variable R|/a|"]; - 379 [label="Operator =="]; - 380 [label="Exit when branch condition"]; - } - 381 [label="Synthetic else branch"]; - 382 [label="Enter when branch result"]; - subgraph cluster_83 { - color=blue - 383 [label="Enter block"]; - 384 [label="Access variable R|/b|"]; - 385 [label="Function call: R|/b|.#()"]; - 386 [label="Exit block"]; - } - 387 [label="Exit when branch result"]; - 388 [label="Exit when"]; - } - 389 [label="Access variable R|/b|"]; - 390 [label="Function call: R|/b|.#()"]; - subgraph cluster_84 { - color=blue - 391 [label="Enter when"]; - subgraph cluster_85 { - color=blue - 392 [label="Enter when branch condition "]; - 393 [label="Access variable R|/b|"]; - 394 [label="Access variable R|/a|"]; - 395 [label="Operator ==="]; - 396 [label="Exit when branch condition"]; - } - 397 [label="Synthetic else branch"]; - 398 [label="Enter when branch result"]; - subgraph cluster_86 { - color=blue - 399 [label="Enter block"]; - 400 [label="Access variable R|/b|"]; - 401 [label="Function call: R|/b|.#()"]; - 402 [label="Exit block"]; - } - 403 [label="Exit when branch result"]; - 404 [label="Exit when"]; - } - 405 [label="Access variable R|/b|"]; - 406 [label="Function call: R|/b|.#()"]; - 407 [label="Exit function test_10" style="filled" fillcolor=red]; - } - - 342 -> {343}; - 343 -> {344}; + 341 -> {342}; + 342 -> {344 343}; + 343 -> {350}; 344 -> {345}; 345 -> {346}; 346 -> {347}; 347 -> {348}; - 348 -> {350 349}; - 349 -> {356}; + 348 -> {349}; + 349 -> {350}; 350 -> {351}; 351 -> {352}; 352 -> {353}; - 353 -> {354}; + + subgraph cluster_80 { + color=red + 354 [label="Enter function test_10" style="filled" fillcolor=red]; + subgraph cluster_81 { + color=blue + 355 [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"]; + } + 361 [label="Synthetic else branch"]; + 362 [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"]; + } + 367 [label="Exit when branch result"]; + 368 [label="Exit when"]; + } + 369 [label="Access variable R|/b|"]; + 370 [label="Function call: R|/b|.#()"]; + subgraph cluster_84 { + color=blue + 371 [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"]; + } + 377 [label="Synthetic else branch"]; + 378 [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"]; + } + 383 [label="Exit when branch result"]; + 384 [label="Exit when"]; + } + 385 [label="Access variable R|/b|"]; + 386 [label="Function call: R|/b|.#()"]; + subgraph cluster_87 { + color=blue + 387 [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"]; + } + 393 [label="Synthetic else branch"]; + 394 [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"]; + } + 399 [label="Exit when branch result"]; + 400 [label="Exit when"]; + } + 401 [label="Access variable R|/b|"]; + 402 [label="Function call: R|/b|.#()"]; + subgraph cluster_90 { + color=blue + 403 [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"]; + } + 409 [label="Synthetic else branch"]; + 410 [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"]; + } + 415 [label="Exit when branch result"]; + 416 [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]; + } + 354 -> {355}; 355 -> {356}; 356 -> {357}; 357 -> {358}; 358 -> {359}; 359 -> {360}; - 360 -> {361}; - 361 -> {362}; + 360 -> {362 361}; + 361 -> {368}; 362 -> {363}; 363 -> {364}; - 364 -> {366 365}; - 365 -> {372}; + 364 -> {365}; + 365 -> {366}; 366 -> {367}; 367 -> {368}; 368 -> {369}; @@ -1086,12 +1117,12 @@ digraph nullability_kt { 373 -> {374}; 374 -> {375}; 375 -> {376}; - 376 -> {377}; - 377 -> {378}; + 376 -> {378 377}; + 377 -> {384}; 378 -> {379}; 379 -> {380}; - 380 -> {382 381}; - 381 -> {388}; + 380 -> {381}; + 381 -> {382}; 382 -> {383}; 383 -> {384}; 384 -> {385}; @@ -1102,12 +1133,12 @@ digraph nullability_kt { 389 -> {390}; 390 -> {391}; 391 -> {392}; - 392 -> {393}; - 393 -> {394}; + 392 -> {394 393}; + 393 -> {400}; 394 -> {395}; 395 -> {396}; - 396 -> {398 397}; - 397 -> {404}; + 396 -> {397}; + 397 -> {398}; 398 -> {399}; 399 -> {400}; 400 -> {401}; @@ -1117,119 +1148,119 @@ digraph nullability_kt { 404 -> {405}; 405 -> {406}; 406 -> {407}; - - subgraph cluster_87 { - color=red - 408 [label="Enter function test_11" style="filled" fillcolor=red]; - subgraph cluster_88 { - color=blue - 409 [label="Enter when"]; - subgraph cluster_89 { - color=blue - 410 [label="Enter when branch condition "]; - 411 [label="Access variable R|/q|"]; - 412 [label="Enter safe call"]; - 413 [label="Access variable R|/QImpl.data|"]; - 414 [label="Exit safe call"]; - 415 [label="Enter safe call"]; - 416 [label="Access variable R|/MyData.s|"]; - 417 [label="Exit safe call"]; - 418 [label="Enter safe call"]; - 419 [label="Function call: R|/q|?.R|/QImpl.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 420 [label="Exit safe call"]; - 421 [label="Const: Null(null)"]; - 422 [label="Operator !="]; - 423 [label="Exit when branch condition"]; - } - 424 [label="Synthetic else branch"]; - 425 [label="Enter when branch result"]; - subgraph cluster_90 { - color=blue - 426 [label="Enter block"]; - 427 [label="Access variable R|/q|"]; - 428 [label="Access variable R|/QImpl.data|"]; - 429 [label="Access variable R|/q|"]; - 430 [label="Access variable R|/QImpl.data|"]; - 431 [label="Access variable R|/MyData.s|"]; - 432 [label="Access variable R|/q|"]; - 433 [label="Access variable R|/QImpl.data|"]; - 434 [label="Access variable R|/MyData.s|"]; - 435 [label="Function call: R|/q|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; - 436 [label="Access variable R|/q2|"]; - 437 [label="Access variable R|/QImpl.data|"]; - 438 [label="Access variable R|/q2|"]; - 439 [label="Access variable R|/QImpl.data|"]; - 440 [label="Access variable #"]; - 441 [label="Access variable R|/q2|"]; - 442 [label="Access variable R|/QImpl.data|"]; - 443 [label="Access variable #"]; - 444 [label="Function call: R|/q2|.R|/QImpl.data|.#.#()"]; - subgraph cluster_91 { - color=blue - 445 [label="Enter when"]; - subgraph cluster_92 { - color=blue - 446 [label="Enter when branch condition "]; - 447 [label="Access variable R|/q2|"]; - 448 [label="Access variable R|/QImpl.data|"]; - 449 [label="Const: Null(null)"]; - 450 [label="Operator !="]; - 451 [label="Exit when branch condition"]; - } - 452 [label="Synthetic else branch"]; - 453 [label="Enter when branch result"]; - subgraph cluster_93 { - color=blue - 454 [label="Enter block"]; - 455 [label="Access variable R|/q2|"]; - 456 [label="Access variable R|/QImpl.data|"]; - 457 [label="Access variable R|/MyData.s|"]; - 458 [label="Access variable R|/q2|"]; - 459 [label="Access variable R|/QImpl.data|"]; - 460 [label="Access variable R|/MyData.s|"]; - 461 [label="Function call: R|/q2|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; - 462 [label="Exit block"]; - } - 463 [label="Exit when branch result"]; - 464 [label="Exit when"]; - } - 465 [label="Exit block"]; - } - 466 [label="Exit when branch result"]; - 467 [label="Exit when"]; - } - 468 [label="Exit function test_11" style="filled" fillcolor=red]; - } - - 408 -> {409}; - 409 -> {410}; + 407 -> {408}; + 408 -> {410 409}; + 409 -> {416}; 410 -> {411}; - 411 -> {412 414}; + 411 -> {412}; 412 -> {413}; 413 -> {414}; - 414 -> {415 417}; + 414 -> {415}; 415 -> {416}; 416 -> {417}; - 417 -> {418 420}; + 417 -> {418}; 418 -> {419}; - 419 -> {420}; + + subgraph cluster_93 { + color=red + 420 [label="Enter function test_11" style="filled" fillcolor=red]; + subgraph cluster_94 { + color=blue + 421 [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"]; + } + 436 [label="Synthetic else branch"]; + 437 [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|.#.#()"]; + subgraph cluster_97 { + color=blue + 457 [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"]; + } + 464 [label="Synthetic else branch"]; + 465 [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"]; + } + 475 [label="Exit when branch result"]; + 476 [label="Exit when"]; + } + 477 [label="Exit block"]; + } + 478 [label="Exit when branch result"]; + 479 [label="Exit when"]; + } + 480 [label="Exit function test_11" style="filled" fillcolor=red]; + } + 420 -> {421}; 421 -> {422}; 422 -> {423}; - 423 -> {425 424}; - 424 -> {467}; + 423 -> {424 426}; + 424 -> {425}; 425 -> {426}; - 426 -> {427}; + 426 -> {427 429}; 427 -> {428}; 428 -> {429}; - 429 -> {430}; + 429 -> {430 432}; 430 -> {431}; 431 -> {432}; 432 -> {433}; 433 -> {434}; 434 -> {435}; - 435 -> {436}; - 436 -> {437}; + 435 -> {437 436}; + 436 -> {479}; 437 -> {438}; 438 -> {439}; 439 -> {440}; @@ -1244,8 +1275,8 @@ digraph nullability_kt { 448 -> {449}; 449 -> {450}; 450 -> {451}; - 451 -> {453 452}; - 452 -> {464}; + 451 -> {452}; + 452 -> {453}; 453 -> {454}; 454 -> {455}; 455 -> {456}; @@ -1256,164 +1287,176 @@ digraph nullability_kt { 460 -> {461}; 461 -> {462}; 462 -> {463}; - 463 -> {464}; - 464 -> {465}; + 463 -> {465 464}; + 464 -> {476}; 465 -> {466}; 466 -> {467}; 467 -> {468}; - - subgraph cluster_94 { - color=red - 469 [label="Enter function test_12" style="filled" fillcolor=red]; - subgraph cluster_95 { - color=blue - 470 [label="Enter when"]; - subgraph cluster_96 { - color=blue - 471 [label="Enter when branch condition "]; - 472 [label="Access variable R|/q|"]; - 473 [label="Enter safe call"]; - 474 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 475 [label="Exit safe call"]; - 476 [label="Enter safe call"]; - 477 [label="Access variable R|/MyData.s|"]; - 478 [label="Exit safe call"]; - 479 [label="Enter safe call"]; - 480 [label="Function call: R|/q|?.R|/QImplWithCustomGetter.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 481 [label="Exit safe call"]; - 482 [label="Const: Null(null)"]; - 483 [label="Operator !="]; - 484 [label="Exit when branch condition"]; - } - 485 [label="Synthetic else branch"]; - 486 [label="Enter when branch result"]; - subgraph cluster_97 { - color=blue - 487 [label="Enter block"]; - 488 [label="Access variable R|/q|"]; - 489 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 490 [label="Access variable R|/q|"]; - 491 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 492 [label="Access variable #"]; - 493 [label="Access variable R|/q|"]; - 494 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 495 [label="Access variable #"]; - 496 [label="Function call: R|/q|.R|/QImplWithCustomGetter.data|.#.#()"]; - 497 [label="Exit block"]; - } - 498 [label="Exit when branch result"]; - 499 [label="Exit when"]; - } - 500 [label="Exit function test_12" style="filled" fillcolor=red]; - } - + 468 -> {469}; 469 -> {470}; 470 -> {471}; 471 -> {472}; - 472 -> {473 475}; + 472 -> {473}; 473 -> {474}; 474 -> {475}; - 475 -> {476 478}; + 475 -> {476}; 476 -> {477}; 477 -> {478}; - 478 -> {479 481}; + 478 -> {479}; 479 -> {480}; - 480 -> {481}; + + subgraph cluster_100 { + color=red + 481 [label="Enter function test_12" style="filled" fillcolor=red]; + subgraph cluster_101 { + color=blue + 482 [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"]; + } + 497 [label="Synthetic else branch"]; + 498 [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"]; + } + 510 [label="Exit when branch result"]; + 511 [label="Exit when"]; + } + 512 [label="Exit function test_12" style="filled" fillcolor=red]; + } + 481 -> {482}; 482 -> {483}; 483 -> {484}; - 484 -> {486 485}; - 485 -> {499}; + 484 -> {485 487}; + 485 -> {486}; 486 -> {487}; - 487 -> {488}; + 487 -> {488 490}; 488 -> {489}; 489 -> {490}; - 490 -> {491}; + 490 -> {491 493}; 491 -> {492}; 492 -> {493}; 493 -> {494}; 494 -> {495}; 495 -> {496}; - 496 -> {497}; - 497 -> {498}; + 496 -> {498 497}; + 497 -> {511}; 498 -> {499}; 499 -> {500}; - - subgraph cluster_98 { - color=red - 501 [label="Enter function test_13" style="filled" fillcolor=red]; - subgraph cluster_99 { - color=blue - 502 [label="Enter when"]; - subgraph cluster_100 { - color=blue - 503 [label="Enter when branch condition "]; - 504 [label="Access variable R|/q|"]; - 505 [label="Enter safe call"]; - 506 [label="Access variable R|/QImplMutable.data|"]; - 507 [label="Exit safe call"]; - 508 [label="Enter safe call"]; - 509 [label="Access variable R|/MyData.s|"]; - 510 [label="Exit safe call"]; - 511 [label="Enter safe call"]; - 512 [label="Function call: R|/q|?.R|/QImplMutable.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; - 513 [label="Exit safe call"]; - 514 [label="Const: Null(null)"]; - 515 [label="Operator !="]; - 516 [label="Exit when branch condition"]; - } - 517 [label="Synthetic else branch"]; - 518 [label="Enter when branch result"]; - subgraph cluster_101 { - color=blue - 519 [label="Enter block"]; - 520 [label="Access variable R|/q|"]; - 521 [label="Access variable R|/QImplMutable.data|"]; - 522 [label="Access variable R|/q|"]; - 523 [label="Access variable R|/QImplMutable.data|"]; - 524 [label="Access variable #"]; - 525 [label="Access variable R|/q|"]; - 526 [label="Access variable R|/QImplMutable.data|"]; - 527 [label="Access variable #"]; - 528 [label="Function call: R|/q|.R|/QImplMutable.data|.#.#()"]; - 529 [label="Exit block"]; - } - 530 [label="Exit when branch result"]; - 531 [label="Exit when"]; - } - 532 [label="Exit function test_13" style="filled" fillcolor=red]; - } - + 500 -> {501}; 501 -> {502}; 502 -> {503}; 503 -> {504}; - 504 -> {505 507}; + 504 -> {505}; 505 -> {506}; 506 -> {507}; - 507 -> {508 510}; + 507 -> {508}; 508 -> {509}; 509 -> {510}; - 510 -> {511 513}; + 510 -> {511}; 511 -> {512}; - 512 -> {513}; + + subgraph cluster_104 { + color=red + 513 [label="Enter function test_13" style="filled" fillcolor=red]; + subgraph cluster_105 { + color=blue + 514 [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"]; + } + 529 [label="Synthetic else branch"]; + 530 [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"]; + } + 542 [label="Exit when branch result"]; + 543 [label="Exit when"]; + } + 544 [label="Exit function test_13" style="filled" fillcolor=red]; + } + 513 -> {514}; 514 -> {515}; 515 -> {516}; - 516 -> {518 517}; - 517 -> {531}; + 516 -> {517 519}; + 517 -> {518}; 518 -> {519}; - 519 -> {520}; + 519 -> {520 522}; 520 -> {521}; 521 -> {522}; - 522 -> {523}; + 522 -> {523 525}; 523 -> {524}; 524 -> {525}; 525 -> {526}; 526 -> {527}; 527 -> {528}; - 528 -> {529}; - 529 -> {530}; + 528 -> {530 529}; + 529 -> {543}; 530 -> {531}; 531 -> {532}; + 532 -> {533}; + 533 -> {534}; + 534 -> {535}; + 535 -> {536}; + 536 -> {537}; + 537 -> {538}; + 538 -> {539}; + 539 -> {540}; + 540 -> {541}; + 541 -> {542}; + 542 -> {543}; + 543 -> {544}; } 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 f8d09dba4b0..582ea23a072 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot @@ -23,95 +23,107 @@ digraph implicitReceivers_kt { 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]; + 5 [label="Enter class A" style="filled" fillcolor=red]; + 6 [label="Exit class A" style="filled" fillcolor=red]; } - 5 -> {6}; - 6 -> {7}; + 5 -> {6} [color=green]; subgraph cluster_3 { color=red - 8 [label="Enter function bar" style="filled" fillcolor=red]; - 9 [label="Exit function bar" style="filled" fillcolor=red]; + 7 [label="Enter function " style="filled" fillcolor=red]; + 8 [label="Delegated constructor call: super()"]; + 9 [label="Exit function " style="filled" fillcolor=red]; } + 7 -> {8}; 8 -> {9}; subgraph cluster_4 { color=red - 10 [label="Enter function with" style="filled" fillcolor=red]; - 11 [label="Exit function with" style="filled" fillcolor=red]; + 10 [label="Enter function bar" style="filled" fillcolor=red]; + 11 [label="Exit function bar" style="filled" fillcolor=red]; } 10 -> {11}; subgraph cluster_5 { color=red - 12 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_6 { - color=blue - 13 [label="Enter when"]; - subgraph cluster_7 { - color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Access variable this@R|/test_1|"]; - 16 [label="Type operator: (this@R|/test_1| is R|A|)"]; - 17 [label="Exit when branch condition"]; - } - subgraph cluster_8 { - color=blue - 18 [label="Enter when branch condition else"]; - 19 [label="Exit when branch condition"]; - } - 20 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 21 [label="Enter block"]; - 22 [label="Access variable this@R|/test_1|"]; - 23 [label="Function call: this@R|/test_1|.#()"]; - 24 [label="Function call: #()"]; - 25 [label="Exit block"]; - } - 26 [label="Exit when branch result"]; - 27 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 28 [label="Enter block"]; - 29 [label="Access variable this@R|/test_1|"]; - 30 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; - 31 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; - 32 [label="Exit block"]; - } - 33 [label="Exit when branch result"]; - 34 [label="Exit when"]; - } - 35 [label="Access variable this@R|/test_1|"]; - 36 [label="Function call: this@R|/test_1|.#()"]; - 37 [label="Function call: #()"]; - 38 [label="Exit function test_1" style="filled" fillcolor=red]; + 12 [label="Enter class B" style="filled" fillcolor=red]; + 13 [label="Exit class B" style="filled" fillcolor=red]; + } + + 12 -> {13} [color=green]; + + subgraph cluster_6 { + color=red + 14 [label="Enter function with" style="filled" fillcolor=red]; + 15 [label="Exit function with" style="filled" fillcolor=red]; } - 12 -> {13}; - 13 -> {14}; 14 -> {15}; - 15 -> {16}; + + subgraph cluster_7 { + color=red + 16 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_8 { + color=blue + 17 [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"]; + } + subgraph cluster_10 { + color=blue + 22 [label="Enter when branch condition else"]; + 23 [label="Exit when branch condition"]; + } + 24 [label="Enter when branch result"]; + subgraph cluster_11 { + 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: #()"]; + 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"]; + } + 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]; + } + 16 -> {17}; - 17 -> {27 18}; + 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {22}; + 21 -> {31 22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; - 26 -> {34}; + 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {31}; + 30 -> {38}; 31 -> {32}; 32 -> {33}; 33 -> {34}; @@ -119,72 +131,72 @@ digraph implicitReceivers_kt { 35 -> {36}; 36 -> {37}; 37 -> {38}; - - subgraph cluster_11 { - color=red - 39 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_12 { - color=blue - 40 [label="Enter when"]; - subgraph cluster_13 { - color=blue - 41 [label="Enter when branch condition "]; - 42 [label="Access variable this@R|/test_2|"]; - 43 [label="Type operator: (this@R|/test_2| !is R|A|)"]; - 44 [label="Exit when branch condition"]; - } - subgraph cluster_14 { - color=blue - 45 [label="Enter when branch condition else"]; - 46 [label="Exit when branch condition"]; - } - 47 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 48 [label="Enter block"]; - 49 [label="Access variable this@R|/test_2|"]; - 50 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; - 51 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; - 52 [label="Exit block"]; - } - 53 [label="Exit when branch result"]; - 54 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 55 [label="Enter block"]; - 56 [label="Access variable this@R|/test_2|"]; - 57 [label="Function call: this@R|/test_2|.#()"]; - 58 [label="Function call: #()"]; - 59 [label="Exit block"]; - } - 60 [label="Exit when branch result"]; - 61 [label="Exit when"]; - } - 62 [label="Access variable this@R|/test_2|"]; - 63 [label="Function call: this@R|/test_2|.#()"]; - 64 [label="Function call: #()"]; - 65 [label="Exit function test_2" style="filled" fillcolor=red]; - } - + 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {43}; + + subgraph cluster_13 { + color=red + 43 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_14 { + color=blue + 44 [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"]; + } + subgraph cluster_16 { + color=blue + 49 [label="Enter when branch condition else"]; + 50 [label="Exit when branch condition"]; + } + 51 [label="Enter when branch result"]; + subgraph cluster_17 { + 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|()"]; + 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"]; + } + 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]; + } + 43 -> {44}; - 44 -> {54 45}; + 44 -> {45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {49}; + 48 -> {58 49}; 49 -> {50}; 50 -> {51}; 51 -> {52}; 52 -> {53}; - 53 -> {61}; + 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {58}; + 57 -> {65}; 58 -> {59}; 59 -> {60}; 60 -> {61}; @@ -192,197 +204,197 @@ digraph implicitReceivers_kt { 62 -> {63}; 63 -> {64}; 64 -> {65}; - - subgraph cluster_17 { - color=red - 66 [label="Enter function test_3" style="filled" fillcolor=red]; - 67 [label="Access variable R|/a|"]; - 68 [label="Postponed enter to lambda"]; - subgraph cluster_18 { - color=blue - 69 [label="Enter function anonymousFunction"]; - 70 [label="Access variable R|/b|"]; - 71 [label="Postponed enter to lambda"]; - subgraph cluster_19 { - color=blue - 72 [label="Enter function anonymousFunction"]; - 73 [label="Access variable R|/c|"]; - 74 [label="Postponed enter to lambda"]; - subgraph cluster_20 { - color=blue - 75 [label="Enter function anonymousFunction"]; - 76 [label="Access variable this@R|special/anonymous|"]; - 77 [label="Type operator: (this@R|special/anonymous| as R|A|)"]; - 78 [label="Access variable this@R|special/anonymous|"]; - 79 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 80 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 81 [label="Exit function anonymousFunction"]; - } - 82 [label="Call arguments union" style="filled" fillcolor=yellow]; - 83 [label="Postponed exit from lambda"]; - 84 [label="Function call: R|kotlin/with|(...)"]; - 85 [label="Access variable this@R|special/anonymous|"]; - 86 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 87 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 88 [label="Exit function anonymousFunction"]; - } - 89 [label="Postponed exit from lambda"]; - 90 [label="Function call: R|kotlin/with|(...)"]; - 91 [label="Exit function anonymousFunction"]; - } - 92 [label="Call arguments union" style="filled" fillcolor=yellow]; - 93 [label="Postponed exit from lambda"]; - 94 [label="Function call: R|kotlin/with|(...)"]; - 95 [label="Exit function test_3" style="filled" fillcolor=red]; - } - + 65 -> {66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; - 68 -> {93} [color=red]; - 69 -> {70}; + + 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"]; + subgraph cluster_20 { + color=blue + 73 [label="Enter function anonymousFunction"]; + 74 [label="Access variable R|/b|"]; + 75 [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"]; + 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"]; + } + 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="Postponed exit from lambda"]; + 94 [label="Function call: R|kotlin/with|(...)"]; + 95 [label="Exit function anonymousFunction"]; + } + 96 [label="Call arguments union" style="filled" fillcolor=yellow]; + 97 [label="Postponed exit from lambda"]; + 98 [label="Function call: R|kotlin/with|(...)"]; + 99 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 70 -> {71}; 71 -> {72}; - 71 -> {89} [color=red]; 72 -> {73}; + 72 -> {97} [color=red]; 73 -> {74}; 74 -> {75}; - 74 -> {83} [color=red]; 75 -> {76}; + 75 -> {93} [color=red]; 76 -> {77}; 77 -> {78}; 78 -> {79}; + 78 -> {87} [color=red]; 79 -> {80}; 80 -> {81}; - 81 -> {83} [color=green]; - 81 -> {82} [color=red]; - 82 -> {84} [color=red]; - 83 -> {84} [color=green]; + 81 -> {82}; + 82 -> {83}; + 83 -> {84}; 84 -> {85}; - 85 -> {86}; - 86 -> {87}; - 87 -> {88}; - 88 -> {89} [color=green]; - 88 -> {92} [color=red]; + 85 -> {87} [color=green]; + 85 -> {86} [color=red]; + 86 -> {88} [color=red]; + 87 -> {88} [color=green]; + 88 -> {89}; 89 -> {90}; 90 -> {91}; - 91 -> {93} [color=green]; - 91 -> {92} [color=red]; - 92 -> {94} [color=red]; - 93 -> {94} [color=green]; + 91 -> {92}; + 92 -> {93} [color=green]; + 92 -> {96} [color=red]; + 93 -> {94}; 94 -> {95}; + 95 -> {97} [color=green]; + 95 -> {96} [color=red]; + 96 -> {98} [color=red]; + 97 -> {98} [color=green]; + 98 -> {99}; - subgraph cluster_21 { + subgraph cluster_23 { color=red - 96 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_22 { + 100 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_24 { color=blue - 97 [label="Enter when"]; - subgraph cluster_23 { - color=blue - 98 [label="Enter when branch condition "]; - 99 [label="Access variable this@R|/test_4|"]; - 100 [label="Type operator: (this@R|/test_4| !is R|A|)"]; - 101 [label="Exit when branch condition"]; - } - subgraph cluster_24 { - color=blue - 102 [label="Enter when branch condition else"]; - 103 [label="Exit when branch condition"]; - } - 104 [label="Enter when branch result"]; + 101 [label="Enter when"]; subgraph cluster_25 { color=blue - 105 [label="Enter block"]; - subgraph cluster_26 { + 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"]; + } + subgraph cluster_26 { + color=blue + 106 [label="Enter when branch condition else"]; + 107 [label="Exit when branch condition"]; + } + 108 [label="Enter when branch result"]; + subgraph cluster_27 { + color=blue + 109 [label="Enter block"]; + subgraph cluster_28 { color=blue - 106 [label="Enter when"]; - subgraph cluster_27 { - color=blue - 107 [label="Enter when branch condition "]; - 108 [label="Access variable this@R|/test_4|"]; - 109 [label="Type operator: (this@R|/test_4| !is R|B|)"]; - 110 [label="Exit when branch condition"]; - } - subgraph cluster_28 { - color=blue - 111 [label="Enter when branch condition else"]; - 112 [label="Exit when branch condition"]; - } - 113 [label="Enter when branch result"]; + 110 [label="Enter when"]; subgraph cluster_29 { color=blue - 114 [label="Enter block"]; - 115 [label="Access variable this@R|/test_4|"]; - 116 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 117 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 118 [label="Access variable this@R|/test_4|"]; - 119 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; - 120 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; - 121 [label="Exit block"]; + 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"]; } - 122 [label="Exit when branch result"]; - 123 [label="Enter when branch result"]; subgraph cluster_30 { color=blue - 124 [label="Enter block"]; - 125 [label="Access variable this@R|/test_4|"]; - 126 [label="Function call: this@R|/test_4|.#()"]; - 127 [label="Function call: #()"]; - 128 [label="Access variable this@R|/test_4|"]; - 129 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 130 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 131 [label="Exit block"]; + 115 [label="Enter when branch condition else"]; + 116 [label="Exit when branch condition"]; } - 132 [label="Exit when branch result"]; - 133 [label="Exit when"]; + 117 [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"]; + } + 126 [label="Exit when branch result"]; + 127 [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|()"]; + 134 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 135 [label="Exit block"]; + } + 136 [label="Exit when branch result"]; + 137 [label="Exit when"]; } - 134 [label="Exit block"]; + 138 [label="Exit block"]; } - 135 [label="Exit when branch result"]; - 136 [label="Enter when branch result"]; - subgraph cluster_31 { + 139 [label="Exit when branch result"]; + 140 [label="Enter when branch result"]; + subgraph cluster_33 { color=blue - 137 [label="Enter block"]; - 138 [label="Access variable this@R|/test_4|"]; - 139 [label="Function call: this@R|/test_4|.#()"]; - 140 [label="Function call: #()"]; - 141 [label="Access variable this@R|/test_4|"]; - 142 [label="Function call: this@R|/test_4|.#()"]; - 143 [label="Function call: #()"]; - 144 [label="Exit block"]; + 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"]; } - 145 [label="Exit when branch result"]; - 146 [label="Exit when"]; + 149 [label="Exit when branch result"]; + 150 [label="Exit when"]; } - 147 [label="Access variable this@R|/test_4|"]; - 148 [label="Function call: this@R|/test_4|.#()"]; - 149 [label="Function call: #()"]; - 150 [label="Access variable this@R|/test_4|"]; - 151 [label="Function call: this@R|/test_4|.#()"]; - 152 [label="Function call: #()"]; - 153 [label="Exit function test_4" style="filled" fillcolor=red]; + 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]; } - 96 -> {97}; - 97 -> {98}; - 98 -> {99}; - 99 -> {100}; 100 -> {101}; - 101 -> {136 102}; + 101 -> {102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; - 105 -> {106}; + 105 -> {140 106}; 106 -> {107}; 107 -> {108}; 108 -> {109}; 109 -> {110}; - 110 -> {123 111}; + 110 -> {111}; 111 -> {112}; 112 -> {113}; 113 -> {114}; - 114 -> {115}; + 114 -> {127 115}; 115 -> {116}; 116 -> {117}; 117 -> {118}; @@ -390,11 +402,11 @@ digraph implicitReceivers_kt { 119 -> {120}; 120 -> {121}; 121 -> {122}; - 122 -> {133}; + 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {127}; + 126 -> {137}; 127 -> {128}; 128 -> {129}; 129 -> {130}; @@ -403,11 +415,11 @@ digraph implicitReceivers_kt { 132 -> {133}; 133 -> {134}; 134 -> {135}; - 135 -> {146}; + 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; - 139 -> {140}; + 139 -> {150}; 140 -> {141}; 141 -> {142}; 142 -> {143}; @@ -421,59 +433,63 @@ digraph implicitReceivers_kt { 150 -> {151}; 151 -> {152}; 152 -> {153}; + 153 -> {154}; + 154 -> {155}; + 155 -> {156}; + 156 -> {157}; - subgraph cluster_32 { + subgraph cluster_34 { color=red - 154 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_33 { + 158 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_35 { color=blue - 155 [label="Enter when"]; - subgraph cluster_34 { - color=blue - 156 [label="Enter when branch condition "]; - 157 [label="Access variable this@R|/test_5|"]; - 158 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"]; - 159 [label="Exit when branch condition"]; - } - subgraph cluster_35 { + 159 [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/String|)"]; + 162 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"]; 163 [label="Exit when branch condition"]; } - subgraph cluster_36 { - color=blue - 164 [label="Enter when branch condition else"]; - 165 [label="Exit when branch condition"]; - } - 166 [label="Enter when branch result"]; subgraph cluster_37 { color=blue - 167 [label="Enter block"]; - 168 [label="Const: Int(0)"]; - 169 [label="Exit block"]; + 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"]; } - 170 [label="Exit when branch result"]; - 171 [label="Enter when branch result"]; subgraph cluster_38 { color=blue - 172 [label="Enter block"]; - 173 [label="Access variable R|kotlin/String.length|"]; - 174 [label="Exit block"]; + 168 [label="Enter when branch condition else"]; + 169 [label="Exit when branch condition"]; } - 175 [label="Exit when branch result"]; - 176 [label="Enter when branch result"]; + 170 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 177 [label="Enter block"]; - 178 [label="Access variable R|kotlin/collections/List.size|"]; - 179 [label="Exit block"]; + 171 [label="Enter block"]; + 172 [label="Const: Int(0)"]; + 173 [label="Exit block"]; } - 180 [label="Exit when branch result"]; - 181 [label="Exit when"]; + 174 [label="Exit when branch result"]; + 175 [label="Enter when branch result"]; + subgraph cluster_40 { + color=blue + 176 [label="Enter block"]; + 177 [label="Access variable R|kotlin/String.length|"]; + 178 [label="Exit block"]; + } + 179 [label="Exit when branch result"]; + 180 [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"]; + } + 184 [label="Exit when branch result"]; + 185 [label="Exit when"]; } - 182 [label="Jump: ^test_5 when () { + 186 [label="Jump: ^test_5 when () { (this@R|/test_5| is R|kotlin/collections/List<*>|) -> { this@R|/test_5|.R|kotlin/collections/List.size| } @@ -485,60 +501,60 @@ digraph implicitReceivers_kt { } } "]; - 183 [label="Stub" style="filled" fillcolor=gray]; - 184 [label="Exit function test_5" style="filled" fillcolor=red]; + 187 [label="Stub" style="filled" fillcolor=gray]; + 188 [label="Exit function test_5" style="filled" fillcolor=red]; } - 154 -> {155}; - 155 -> {156}; - 156 -> {157}; - 157 -> {158}; 158 -> {159}; - 159 -> {176 160}; + 159 -> {160}; 160 -> {161}; 161 -> {162}; 162 -> {163}; - 163 -> {171 164}; + 163 -> {180 164}; 164 -> {165}; 165 -> {166}; 166 -> {167}; - 167 -> {168}; + 167 -> {175 168}; 168 -> {169}; 169 -> {170}; - 170 -> {181}; + 170 -> {171}; 171 -> {172}; 172 -> {173}; 173 -> {174}; - 174 -> {175}; - 175 -> {181}; + 174 -> {185}; + 175 -> {176}; 176 -> {177}; 177 -> {178}; 178 -> {179}; - 179 -> {180}; + 179 -> {185}; 180 -> {181}; 181 -> {182}; - 182 -> {184}; - 182 -> {183} [style=dotted]; - 183 -> {184} [style=dotted]; + 182 -> {183}; + 183 -> {184}; + 184 -> {185}; + 185 -> {186}; + 186 -> {188}; + 186 -> {187} [style=dotted]; + 187 -> {188} [style=dotted]; - subgraph cluster_40 { + subgraph cluster_42 { color=red - 185 [label="Enter function test_6" style="filled" fillcolor=red]; - 186 [label="Access variable this@R|/test_6|"]; - 187 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"]; - 188 [label="Access variable R|kotlin/collections/List.size|"]; - 189 [label="Access variable this@R|/test_6|"]; - 190 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"]; - 191 [label="Access variable R|kotlin/String.length|"]; - 192 [label="Exit function test_6" style="filled" fillcolor=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]; } - 185 -> {186}; - 186 -> {187}; - 187 -> {188}; - 188 -> {189}; 189 -> {190}; 190 -> {191}; 191 -> {192}; + 192 -> {193}; + 193 -> {194}; + 194 -> {195}; + 195 -> {196}; } 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 7bd859d08f9..6d3c0fae35e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/thisOfExtensionProperty.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/thisOfExtensionProperty.dot @@ -5,96 +5,111 @@ digraph thisOfExtensionProperty_kt { subgraph cluster_0 { color=red - 0 [label="Enter function getter" style="filled" fillcolor=red]; - 1 [label="Exit function getter" style="filled" fillcolor=red]; + 0 [label="Enter class A" style="filled" fillcolor=red]; + 1 [label="Exit class A" style="filled" fillcolor=red]; } - 0 -> {1}; + 0 -> {1} [color=green]; subgraph cluster_1 { color=red - 2 [label="Enter property" style="filled" fillcolor=red]; - 3 [label="Exit property" style="filled" fillcolor=red]; + 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 function getter" style="filled" fillcolor=red]; - subgraph cluster_3 { - color=blue - 5 [label="Enter &&"]; - 6 [label="Access variable this@R|/check_1|"]; - 7 [label="Type operator: (this@R|/check_1| is R|B|)"]; - 8 [label="Exit left part of &&"]; - 9 [label="Enter right part of &&"]; - 10 [label="Access variable R|/B.b|"]; - 11 [label="Exit &&"]; - } - 12 [label="Jump: ^ (this@R|/check_1| is R|B|) && this@R|/check_1|.R|/B.b|"]; - 13 [label="Stub" style="filled" fillcolor=gray]; - 14 [label="Exit function getter" style="filled" fillcolor=red]; + 4 [label="Enter property" style="filled" fillcolor=red]; + 5 [label="Exit property" style="filled" fillcolor=red]; } 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {8}; - 8 -> {11 9}; - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {14}; - 12 -> {13} [style=dotted]; - 13 -> {14} [style=dotted]; + + subgraph cluster_3 { + color=red + 6 [label="Enter class B" style="filled" fillcolor=red]; + 7 [label="Exit class B" style="filled" fillcolor=red]; + } + subgraph cluster_4 { color=red - 15 [label="Enter property" style="filled" fillcolor=red]; - 16 [label="Exit property" style="filled" fillcolor=red]; - } - - 15 -> {16}; - - subgraph cluster_5 { - color=red - 17 [label="Enter function getter" style="filled" fillcolor=red]; - subgraph cluster_6 { + 8 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_5 { color=blue - 18 [label="Enter &&"]; - 19 [label="Access variable this@R|/check_2|"]; - 20 [label="Type operator: (this@R|/check_2| is R|B|)"]; - 21 [label="Exit left part of &&"]; - 22 [label="Enter right part of &&"]; - 23 [label="Access variable this@R|/check_2|"]; - 24 [label="Access variable R|/B.b|"]; - 25 [label="Exit &&"]; + 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 &&"]; } - 26 [label="Jump: ^ (this@R|/check_2| is R|B|) && this@R|/check_2|.R|/B.b|"]; - 27 [label="Stub" style="filled" fillcolor=gray]; - 28 [label="Exit function getter" style="filled" fillcolor=red]; + 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]; + } + + 8 -> {9}; + 9 -> {10}; + 10 -> {11}; + 11 -> {12}; + 12 -> {15 13}; + 13 -> {14}; + 14 -> {15}; + 15 -> {16}; + 16 -> {18}; + 16 -> {17} [style=dotted]; + 17 -> {18} [style=dotted]; + + subgraph cluster_6 { + color=red + 19 [label="Enter property" style="filled" fillcolor=red]; + 20 [label="Exit property" style="filled" fillcolor=red]; } - 17 -> {18}; - 18 -> {19}; 19 -> {20}; - 20 -> {21}; - 21 -> {25 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 property" style="filled" fillcolor=red]; - 30 [label="Exit property" style="filled" fillcolor=red]; + 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 &&"]; + } + 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]; } + 21 -> {22}; + 22 -> {23}; + 23 -> {24}; + 24 -> {25}; + 25 -> {29 26}; + 26 -> {27}; + 27 -> {28}; + 28 -> {29}; 29 -> {30}; + 30 -> {32}; + 30 -> {31} [style=dotted]; + 31 -> {32} [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 8517ce47116..ba86e8f7836 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot @@ -56,42 +56,47 @@ digraph assignSafeCall_kt { subgraph cluster_5 { color=red - 15 [label="Enter function test_1" style="filled" fillcolor=red]; - 16 [label="Access variable R|/a|"]; - 17 [label="Enter safe call"]; - 18 [label="Access variable R|/A.x|"]; - 19 [label="Exit safe call"]; - 20 [label="Variable declaration: lval x: R|kotlin/Int?|"]; - subgraph cluster_6 { - color=blue - 21 [label="Enter when"]; - subgraph cluster_7 { - color=blue - 22 [label="Enter when branch condition "]; - 23 [label="Access variable R|/x|"]; - 24 [label="Const: Null(null)"]; - 25 [label="Operator !="]; - 26 [label="Exit when branch condition"]; - } - 27 [label="Synthetic else branch"]; - 28 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 29 [label="Enter block"]; - 30 [label="Access variable R|/a|"]; - 31 [label="Function call: R|/a|.R|/A.bar|()"]; - 32 [label="Exit block"]; - } - 33 [label="Exit when branch result"]; - 34 [label="Exit when"]; - } - 35 [label="Exit function test_1" style="filled" fillcolor=red]; + 15 [label="Enter class A" style="filled" fillcolor=red]; + 16 [label="Exit class A" style="filled" fillcolor=red]; + } + + + 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|"]; + 21 [label="Exit safe call"]; + 22 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + subgraph cluster_7 { + color=blue + 23 [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"]; + } + 29 [label="Synthetic else branch"]; + 30 [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"]; + } + 35 [label="Exit when branch result"]; + 36 [label="Exit when"]; + } + 37 [label="Exit function test_1" style="filled" fillcolor=red]; } - 15 -> {16}; - 16 -> {17 19}; 17 -> {18}; - 18 -> {19}; + 18 -> {19 21}; 19 -> {20}; 20 -> {21}; 21 -> {22}; @@ -99,54 +104,54 @@ digraph assignSafeCall_kt { 23 -> {24}; 24 -> {25}; 25 -> {26}; - 26 -> {28 27}; - 27 -> {34}; - 28 -> {29}; - 29 -> {30}; + 26 -> {27}; + 27 -> {28}; + 28 -> {30 29}; + 29 -> {36}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; 34 -> {35}; + 35 -> {36}; + 36 -> {37}; - subgraph cluster_9 { + subgraph cluster_10 { color=red - 36 [label="Enter function test_2" style="filled" fillcolor=red]; - 37 [label="Access variable R|/a|"]; - 38 [label="Enter safe call"]; - 39 [label="Function call: R|/a|?.R|/A.foo|()"]; - 40 [label="Exit safe call"]; - 41 [label="Variable declaration: lval x: R|kotlin/Int?|"]; - subgraph cluster_10 { + 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|()"]; + 42 [label="Exit safe call"]; + 43 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + subgraph cluster_11 { color=blue - 42 [label="Enter when"]; - subgraph cluster_11 { - color=blue - 43 [label="Enter when branch condition "]; - 44 [label="Access variable R|/x|"]; - 45 [label="Const: Null(null)"]; - 46 [label="Operator !="]; - 47 [label="Exit when branch condition"]; - } - 48 [label="Synthetic else branch"]; - 49 [label="Enter when branch result"]; + 44 [label="Enter when"]; subgraph cluster_12 { color=blue - 50 [label="Enter block"]; - 51 [label="Access variable R|/a|"]; - 52 [label="Function call: R|/a|.R|/A.bar|()"]; - 53 [label="Exit block"]; + 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"]; } - 54 [label="Exit when branch result"]; - 55 [label="Exit when"]; + 50 [label="Synthetic else branch"]; + 51 [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"]; + } + 56 [label="Exit when branch result"]; + 57 [label="Exit when"]; } - 56 [label="Exit function test_2" style="filled" fillcolor=red]; + 58 [label="Exit function test_2" style="filled" fillcolor=red]; } - 36 -> {37}; - 37 -> {38 40}; 38 -> {39}; - 39 -> {40}; + 39 -> {40 42}; 40 -> {41}; 41 -> {42}; 42 -> {43}; @@ -154,312 +159,321 @@ digraph assignSafeCall_kt { 44 -> {45}; 45 -> {46}; 46 -> {47}; - 47 -> {49 48}; - 48 -> {55}; - 49 -> {50}; - 50 -> {51}; + 47 -> {48}; + 48 -> {49}; + 49 -> {51 50}; + 50 -> {57}; 51 -> {52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; + 56 -> {57}; + 57 -> {58}; - subgraph cluster_13 { + subgraph cluster_14 { color=red - 57 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_14 { + 59 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_15 { color=blue - 58 [label="Enter when"]; - 59 [label="Access variable R|/x|"]; - 60 [label="Type operator: (R|/x| as? R|A|)"]; - 61 [label="Variable declaration: lval : R|A?|"]; - subgraph cluster_15 { - color=blue - 62 [label="Enter when branch condition "]; - 63 [label="Const: Null(null)"]; - 64 [label="Operator =="]; - 65 [label="Exit when branch condition"]; - } + 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?|"]; subgraph cluster_16 { color=blue - 66 [label="Enter when branch condition else"]; + 64 [label="Enter when branch condition "]; + 65 [label="Const: Null(null)"]; + 66 [label="Operator =="]; 67 [label="Exit when branch condition"]; } - 68 [label="Enter when branch result"]; subgraph cluster_17 { color=blue - 69 [label="Enter block"]; - 70 [label="Access variable R|/|"]; - 71 [label="Exit block"]; + 68 [label="Enter when branch condition else"]; + 69 [label="Exit when branch condition"]; } - 72 [label="Exit when branch result"]; - 73 [label="Enter when branch result"]; + 70 [label="Enter when branch result"]; subgraph cluster_18 { color=blue - 74 [label="Enter block"]; - 75 [label="Jump: ^test_3 Unit"]; - 76 [label="Stub" style="filled" fillcolor=gray]; - 77 [label="Exit block" style="filled" fillcolor=gray]; + 71 [label="Enter block"]; + 72 [label="Access variable R|/|"]; + 73 [label="Exit block"]; } - 78 [label="Exit when branch result" style="filled" fillcolor=gray]; - 79 [label="Exit when"]; + 74 [label="Exit when branch result"]; + 75 [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]; + } + 80 [label="Exit when branch result" style="filled" fillcolor=gray]; + 81 [label="Exit when"]; } - 80 [label="Variable declaration: lval a: R|A|"]; - 81 [label="Access variable R|/a|"]; - 82 [label="Function call: R|/a|.R|/A.foo|()"]; - 83 [label="Access variable R|/x|"]; - 84 [label="Function call: R|/x|.R|/A.foo|()"]; - 85 [label="Exit function test_3" style="filled" fillcolor=red]; + 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]; } - 57 -> {58}; - 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; 62 -> {63}; 63 -> {64}; 64 -> {65}; - 65 -> {73 66}; + 65 -> {66}; 66 -> {67}; - 67 -> {68}; + 67 -> {75 68}; 68 -> {69}; 69 -> {70}; 70 -> {71}; 71 -> {72}; - 72 -> {79}; + 72 -> {73}; 73 -> {74}; - 74 -> {75}; - 75 -> {85}; - 75 -> {76} [style=dotted]; - 76 -> {77} [style=dotted]; + 74 -> {81}; + 75 -> {76}; + 76 -> {77}; + 77 -> {87}; 77 -> {78} [style=dotted]; 78 -> {79} [style=dotted]; - 79 -> {80}; - 80 -> {81}; + 79 -> {80} [style=dotted]; + 80 -> {81} [style=dotted]; 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; - - subgraph cluster_19 { - color=red - 86 [label="Enter function foo" style="filled" fillcolor=red]; - 87 [label="Exit function foo" style="filled" fillcolor=red]; - } - + 85 -> {86}; 86 -> {87}; subgraph cluster_20 { color=red - 88 [label="Enter function getter" style="filled" fillcolor=red]; - 89 [label="Exit function getter" style="filled" fillcolor=red]; + 88 [label="Enter function foo" style="filled" fillcolor=red]; + 89 [label="Exit function foo" style="filled" fillcolor=red]; } 88 -> {89}; subgraph cluster_21 { color=red - 90 [label="Enter property" style="filled" fillcolor=red]; - 91 [label="Exit property" style="filled" fillcolor=red]; + 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 function bar" style="filled" fillcolor=red]; - 93 [label="Exit function bar" style="filled" fillcolor=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 test_1" style="filled" fillcolor=red]; - 95 [label="Access variable R|/a|"]; - 96 [label="Enter safe call"]; - 97 [label="Access variable R|/B.x|"]; - 98 [label="Exit safe call"]; - 99 [label="Variable declaration: lval x: R|kotlin/Int?|"]; - subgraph cluster_24 { - color=blue - 100 [label="Enter when"]; - subgraph cluster_25 { - color=blue - 101 [label="Enter when branch condition "]; - 102 [label="Access variable R|/x|"]; - 103 [label="Const: Null(null)"]; - 104 [label="Operator !="]; - 105 [label="Exit when branch condition"]; - } - 106 [label="Synthetic else branch"]; - 107 [label="Enter when branch result"]; - subgraph cluster_26 { - color=blue - 108 [label="Enter block"]; - 109 [label="Access variable R|/a|"]; - 110 [label="Function call: R|/a|.R|/B.bar|()"]; - 111 [label="Exit block"]; - } - 112 [label="Exit when branch result"]; - 113 [label="Exit when"]; - } - 114 [label="Exit function test_1" style="filled" fillcolor=red]; + 94 [label="Enter function bar" style="filled" fillcolor=red]; + 95 [label="Exit function bar" style="filled" fillcolor=red]; } 94 -> {95}; - 95 -> {96 98}; - 96 -> {97}; - 97 -> {98}; + + subgraph cluster_24 { + color=red + 96 [label="Enter class B" style="filled" fillcolor=red]; + 97 [label="Exit class B" style="filled" fillcolor=red]; + } + + + 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|"]; + 102 [label="Exit safe call"]; + 103 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + subgraph cluster_26 { + color=blue + 104 [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"]; + } + 110 [label="Synthetic else branch"]; + 111 [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"]; + } + 116 [label="Exit when branch result"]; + 117 [label="Exit when"]; + } + 118 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 98 -> {99}; - 99 -> {100}; + 99 -> {100 102}; 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; - 105 -> {107 106}; - 106 -> {113}; + 105 -> {106}; + 106 -> {107}; 107 -> {108}; 108 -> {109}; - 109 -> {110}; - 110 -> {111}; + 109 -> {111 110}; + 110 -> {117}; 111 -> {112}; 112 -> {113}; 113 -> {114}; + 114 -> {115}; + 115 -> {116}; + 116 -> {117}; + 117 -> {118}; - subgraph cluster_27 { + subgraph cluster_29 { color=red - 115 [label="Enter function test_2" style="filled" fillcolor=red]; - 116 [label="Access variable R|/a|"]; - 117 [label="Enter safe call"]; - 118 [label="Function call: R|/a|?.R|/B.foo|()"]; - 119 [label="Exit safe call"]; - 120 [label="Variable declaration: lval x: R|kotlin/Int?|"]; - subgraph cluster_28 { + 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|()"]; + 123 [label="Exit safe call"]; + 124 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + subgraph cluster_30 { color=blue - 121 [label="Enter when"]; - subgraph cluster_29 { + 125 [label="Enter when"]; + subgraph cluster_31 { color=blue - 122 [label="Enter when branch condition "]; - 123 [label="Access variable R|/x|"]; - 124 [label="Const: Null(null)"]; - 125 [label="Operator !="]; - 126 [label="Exit when branch condition"]; + 126 [label="Enter when branch condition "]; + 127 [label="Access variable R|/x|"]; + 128 [label="Const: Null(null)"]; + 129 [label="Operator !="]; + 130 [label="Exit when branch condition"]; } - 127 [label="Synthetic else branch"]; - 128 [label="Enter when branch result"]; - subgraph cluster_30 { + 131 [label="Synthetic else branch"]; + 132 [label="Enter when branch result"]; + subgraph cluster_32 { color=blue - 129 [label="Enter block"]; - 130 [label="Access variable R|/a|"]; - 131 [label="Function call: R|/a|.R|/B.bar|()"]; - 132 [label="Exit block"]; + 133 [label="Enter block"]; + 134 [label="Access variable R|/a|"]; + 135 [label="Function call: R|/a|.R|/B.bar|()"]; + 136 [label="Exit block"]; } - 133 [label="Exit when branch result"]; - 134 [label="Exit when"]; + 137 [label="Exit when branch result"]; + 138 [label="Exit when"]; } - 135 [label="Exit function test_2" style="filled" fillcolor=red]; + 139 [label="Exit function test_2" style="filled" fillcolor=red]; } - 115 -> {116}; - 116 -> {117 119}; - 117 -> {118}; - 118 -> {119}; 119 -> {120}; - 120 -> {121}; + 120 -> {121 123}; 121 -> {122}; 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {128 127}; - 127 -> {134}; + 126 -> {127}; + 127 -> {128}; 128 -> {129}; 129 -> {130}; - 130 -> {131}; - 131 -> {132}; + 130 -> {132 131}; + 131 -> {138}; 132 -> {133}; 133 -> {134}; 134 -> {135}; - - subgraph cluster_31 { - color=red - 136 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_32 { - color=blue - 137 [label="Enter when"]; - 138 [label="Access variable R|/x|"]; - 139 [label="Type operator: (R|/x| as? R|B|)"]; - 140 [label="Variable declaration: lval : R|B?|"]; - subgraph cluster_33 { - color=blue - 141 [label="Enter when branch condition "]; - 142 [label="Const: Null(null)"]; - 143 [label="Operator =="]; - 144 [label="Exit when branch condition"]; - } - subgraph cluster_34 { - color=blue - 145 [label="Enter when branch condition else"]; - 146 [label="Exit when branch condition"]; - } - 147 [label="Enter when branch result"]; - subgraph cluster_35 { - color=blue - 148 [label="Enter block"]; - 149 [label="Access variable R|/|"]; - 150 [label="Exit block"]; - } - 151 [label="Exit when branch result"]; - 152 [label="Enter when branch result"]; - subgraph cluster_36 { - color=blue - 153 [label="Enter block"]; - 154 [label="Jump: ^test_3 Unit"]; - 155 [label="Stub" style="filled" fillcolor=gray]; - 156 [label="Exit block" style="filled" fillcolor=gray]; - } - 157 [label="Exit when branch result" style="filled" fillcolor=gray]; - 158 [label="Exit when"]; - } - 159 [label="Variable declaration: lval a: R|B|"]; - 160 [label="Access variable R|/a|"]; - 161 [label="Function call: R|/a|.R|/B.foo|()"]; - 162 [label="Access variable R|/x|"]; - 163 [label="Function call: R|/x|.R|/B.foo|()"]; - 164 [label="Exit function test_3" style="filled" fillcolor=red]; - } - + 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; - 139 -> {140}; + + 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?|"]; + 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"]; + } + subgraph cluster_36 { + color=blue + 149 [label="Enter when branch condition else"]; + 150 [label="Exit when branch condition"]; + } + 151 [label="Enter when branch result"]; + subgraph cluster_37 { + color=blue + 152 [label="Enter block"]; + 153 [label="Access variable R|/|"]; + 154 [label="Exit block"]; + } + 155 [label="Exit when branch result"]; + 156 [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]; + } + 161 [label="Exit when branch result" style="filled" fillcolor=gray]; + 162 [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]; + } + 140 -> {141}; 141 -> {142}; 142 -> {143}; 143 -> {144}; - 144 -> {152 145}; + 144 -> {145}; 145 -> {146}; 146 -> {147}; 147 -> {148}; - 148 -> {149}; + 148 -> {156 149}; 149 -> {150}; 150 -> {151}; - 151 -> {158}; + 151 -> {152}; 152 -> {153}; 153 -> {154}; - 154 -> {164}; - 154 -> {155} [style=dotted]; - 155 -> {156} [style=dotted]; - 156 -> {157} [style=dotted]; - 157 -> {158} [style=dotted]; - 158 -> {159}; - 159 -> {160}; - 160 -> {161}; - 161 -> {162}; + 154 -> {155}; + 155 -> {162}; + 156 -> {157}; + 157 -> {158}; + 158 -> {168}; + 158 -> {159} [style=dotted]; + 159 -> {160} [style=dotted]; + 160 -> {161} [style=dotted]; + 161 -> {162} [style=dotted]; 162 -> {163}; 163 -> {164}; + 164 -> {165}; + 165 -> {166}; + 166 -> {167}; + 167 -> {168}; } 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 d90a9af6ead..0016cfa19a9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot @@ -80,162 +80,170 @@ digraph safeCalls_kt { subgraph cluster_6 { color=red - 25 [label="Enter function test_2" style="filled" fillcolor=red]; - 26 [label="Access variable R|/x|"]; - 27 [label="Type operator: (R|/x| as? R|A|)"]; - 28 [label="Enter safe call"]; - 29 [label="Access variable R|/x|"]; - 30 [label="Function call: (R|/x| as? R|A|)?.R|/A.bar|(...)"]; - 31 [label="Exit safe call"]; - 32 [label="Exit function test_2" style="filled" fillcolor=red]; + 25 [label="Enter class A" style="filled" fillcolor=red]; + 26 [label="Exit class A" style="filled" fillcolor=red]; } - 25 -> {26}; - 26 -> {27}; - 27 -> {28 31}; - 28 -> {29}; - 29 -> {30}; - 30 -> {31}; - 31 -> {32}; + 25 -> {26} [color=green]; subgraph cluster_7 { color=red - 33 [label="Enter function test_3" style="filled" fillcolor=red]; - 34 [label="Access variable R|/x|"]; - 35 [label="Type operator: (R|/x| as? R|A|)"]; - 36 [label="Enter safe call"]; - 37 [label="Access variable R|/x|"]; - 38 [label="Function call: (R|/x| as? R|A|)?.R|/A.bar|(...)"]; - 39 [label="Exit safe call"]; - 40 [label="Enter safe call"]; - 41 [label="Access variable R|/x|"]; - 42 [label="Function call: R|/x|.R|/A.bool|()"]; - 43 [label="Function call: (R|/x| as? R|A|)?.R|/A.bar|(...)?.R|/foo|(...)"]; - 44 [label="Exit safe call"]; - 45 [label="Enter safe call"]; - 46 [label="Postponed enter to lambda"]; - 47 [label="Postponed exit from lambda"]; - 48 [label="Function call: (R|/x| as? R|A|)?.R|/A.bar|(...)?.R|/foo|(...)?.R|/let|(...)"]; - 49 [label="Exit safe call"]; - 50 [label="Access variable R|/x|"]; - 51 [label="Function call: R|/x|.#()"]; - 52 [label="Exit function test_3" style="filled" fillcolor=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]; } + 27 -> {28}; + 28 -> {29}; + 29 -> {30 33}; + 30 -> {31}; + 31 -> {32}; + 32 -> {33}; 33 -> {34}; - 34 -> {35}; - 35 -> {36 39}; - 36 -> {37}; - 37 -> {38}; - 38 -> {39}; - 39 -> {40 44}; - 40 -> {41}; - 41 -> {42}; - 42 -> {43}; - 43 -> {44}; - 44 -> {45 49}; - 45 -> {46}; - 46 -> {47 47} [color=green]; - 47 -> {48}; - 48 -> {49}; - 49 -> {50}; - 50 -> {51}; - 51 -> {52}; subgraph cluster_8 { color=red - 53 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 54 [label="Access variable R|/x|"]; - 55 [label="Function call: R|/x|.R|/A.bool|()"]; - 56 [label="Exit function anonymousFunction" style="filled" fillcolor=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]; } + 35 -> {36}; + 36 -> {37}; + 37 -> {38 41}; + 38 -> {39}; + 39 -> {40}; + 40 -> {41}; + 41 -> {42 46}; + 42 -> {43}; + 43 -> {44}; + 44 -> {45}; + 45 -> {46}; + 46 -> {47 51}; + 47 -> {48}; + 48 -> {49 49} [color=green]; + 49 -> {50}; + 50 -> {51}; + 51 -> {52}; + 52 -> {53}; 53 -> {54}; - 54 -> {55}; - 55 -> {56}; subgraph cluster_9 { color=red - 57 [label="Enter function test_4" style="filled" fillcolor=red]; - 58 [label="Access variable R|/x|"]; - 59 [label="Enter safe call"]; - 60 [label="Function call: R|/x|?.R|/A.id|()"]; - 61 [label="Exit safe call"]; - 62 [label="Enter safe call"]; - 63 [label="Function call: R|/x|?.R|/A.id|()?.R|/A.bool|()"]; - 64 [label="Exit safe call"]; - 65 [label="Access variable R|/x|"]; - 66 [label="Function call: R|/x|.#()"]; - 67 [label="Exit function test_4" style="filled" fillcolor=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}; 57 -> {58}; - 58 -> {59 61}; - 59 -> {60}; - 60 -> {61}; - 61 -> {62 64}; - 62 -> {63}; - 63 -> {64}; - 64 -> {65}; - 65 -> {66}; - 66 -> {67}; subgraph cluster_10 { color=red - 68 [label="Enter function boo" style="filled" fillcolor=red]; - 69 [label="Exit function boo" style="filled" fillcolor=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|()"]; + 63 [label="Exit safe call"]; + 64 [label="Enter safe call"]; + 65 [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]; } + 59 -> {60}; + 60 -> {61 63}; + 61 -> {62}; + 62 -> {63}; + 63 -> {64 66}; + 64 -> {65}; + 65 -> {66}; + 66 -> {67}; + 67 -> {68}; 68 -> {69}; subgraph cluster_11 { color=red - 70 [label="Enter function test_5" style="filled" fillcolor=red]; - 71 [label="Access variable R|/x|"]; - 72 [label="Enter safe call"]; - 73 [label="Postponed enter to lambda"]; - subgraph cluster_12 { - color=blue - 74 [label="Enter function anonymousFunction"]; - 75 [label="Jump: ^test_5 Unit"]; - 76 [label="Stub" style="filled" fillcolor=gray]; - 77 [label="Exit function anonymousFunction" style="filled" fillcolor=gray]; - } - 78 [label="Call arguments union" style="filled" fillcolor=gray]; - 79 [label="Postponed exit from lambda"]; - 80 [label="Function call: R|/x|?.R|kotlin/let|(...)" style="filled" fillcolor=gray]; - 81 [label="Exit safe call"]; - 82 [label="Enter safe call"]; - 83 [label="Access variable R|/x|"]; - 84 [label="Function call: R|/x|.R|/A.bool|()"]; - 85 [label="Function call: R|/x|?.R|kotlin/let|(...)?.R|/boo|(...)"]; - 86 [label="Exit safe call"]; - 87 [label="Access variable R|/x|"]; - 88 [label="Function call: R|/x|.#()"]; - 89 [label="Exit function test_5" style="filled" fillcolor=red]; + 70 [label="Enter function boo" style="filled" fillcolor=red]; + 71 [label="Exit function boo" style="filled" fillcolor=red]; } 70 -> {71}; - 71 -> {72 81}; + + 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"]; + 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]; + } + 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]; + } + 72 -> {73}; - 73 -> {74}; - 73 -> {79} [color=red]; + 73 -> {74 83}; 74 -> {75}; - 75 -> {89}; - 75 -> {76} [style=dotted]; - 76 -> {77} [style=dotted]; + 75 -> {76}; + 75 -> {81} [color=red]; + 76 -> {77}; + 77 -> {91}; 77 -> {78} [style=dotted]; - 77 -> {79} [color=green]; - 78 -> {80} [style=dotted]; - 79 -> {80} [color=green]; - 80 -> {81} [style=dotted]; - 81 -> {82 86}; - 82 -> {83}; - 83 -> {84}; + 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}; 87 -> {88}; 88 -> {89}; + 89 -> {90}; + 90 -> {91}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot index b33c340f8e7..af97c58c879 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot @@ -5,76 +5,99 @@ digraph smartCastInInit_kt { subgraph cluster_0 { color=red - 0 [label="Enter function foo" style="filled" fillcolor=red]; - 1 [label="Exit function foo" style="filled" fillcolor=red]; + 0 [label="Enter class I" style="filled" fillcolor=red]; + 1 [label="Exit class I" style="filled" fillcolor=red]; } - 0 -> {1}; + 0 -> {1} [color=green]; subgraph cluster_1 { color=red - 2 [label="Enter function s" style="filled" fillcolor=red]; - 3 [label="Function call: R|kotlin/TODO|()"]; - 4 [label="Stub" style="filled" fillcolor=gray]; - 5 [label="Jump: ^s R|kotlin/TODO|()" style="filled" fillcolor=gray]; - 6 [label="Stub" style="filled" fillcolor=gray]; - 7 [label="Exit function s" style="filled" fillcolor=red]; + 2 [label="Enter function foo" style="filled" fillcolor=red]; + 3 [label="Exit function foo" style="filled" fillcolor=red]; } 2 -> {3}; - 3 -> {7}; - 3 -> {4} [style=dotted]; - 4 -> {5} [style=dotted]; - 5 -> {7 6} [style=dotted]; - 6 -> {7} [style=dotted]; subgraph cluster_2 { color=red - 8 [label="Enter function " style="filled" fillcolor=red]; - 9 [label="Delegated constructor call: super()"]; - 10 [label="Exit function " style="filled" fillcolor=red]; + 4 [label="Enter class S" style="filled" fillcolor=red]; + 5 [label="Exit class S" style="filled" fillcolor=red]; } - 8 -> {9}; - 9 -> {10}; + 4 -> {5} [color=green]; subgraph cluster_3 { color=red - 11 [label="Enter function getter" style="filled" fillcolor=red]; - 12 [label="Exit function getter" style="filled" fillcolor=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]; } - 11 -> {12}; + 6 -> {7}; + 7 -> {11}; + 7 -> {8} [style=dotted]; + 8 -> {9} [style=dotted]; + 9 -> {11 10} [style=dotted]; + 10 -> {11} [style=dotted]; subgraph cluster_4 { color=red - 13 [label="Enter property" style="filled" fillcolor=red]; - 14 [label="Exit property" style="filled" fillcolor=red]; + 12 [label="Enter function " style="filled" fillcolor=red]; + 13 [label="Delegated constructor call: super()"]; + 14 [label="Exit function " style="filled" fillcolor=red]; } + 12 -> {13}; 13 -> {14}; subgraph cluster_5 { color=red - 15 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_6 { - color=blue - 16 [label="Enter block"]; - 17 [label="Function call: R|/s|()"]; - 18 [label="Assignmenet: R|/Main.x|"]; - 19 [label="Access variable R|/Main.x|"]; - 20 [label="Function call: this@R|/Main|.R|/Main.x|.R|/S.foo|()"]; - 21 [label="Exit block"]; - } - 22 [label="Exit init block" style="filled" fillcolor=red]; + 15 [label="Enter function getter" style="filled" fillcolor=red]; + 16 [label="Exit function getter" style="filled" fillcolor=red]; } 15 -> {16}; - 16 -> {17}; + + subgraph cluster_6 { + color=red + 17 [label="Enter property" style="filled" fillcolor=red]; + 18 [label="Exit property" style="filled" fillcolor=red]; + } + 17 -> {18}; - 18 -> {19}; + + subgraph cluster_7 { + color=red + 19 [label="Enter init block" 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"]; + } + 26 [label="Exit init block" style="filled" fillcolor=red]; + } + 19 -> {20}; 20 -> {21}; 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]; + } + } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot index 9077b674811..40fc224ef35 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot @@ -148,83 +148,88 @@ digraph smartcastToNothing_kt { subgraph cluster_12 { color=red - 45 [label="Enter function test_0" style="filled" fillcolor=red]; - 46 [label="Const: Null(null)"]; - 47 [label="Variable declaration: lvar s: R|A?|"]; - 48 [label="Access variable R|/results|"]; - 49 [label="Function call: R|/results|.R|FakeOverride|>|()"]; - 50 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; - subgraph cluster_13 { - color=blue - 51 [label="Enter while loop"]; - subgraph cluster_14 { - color=blue - 52 [label="Enter loop condition"]; - 53 [label="Access variable R|/|"]; - 54 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 55 [label="Exit loop condition"]; - } - subgraph cluster_15 { - color=blue - 56 [label="Enter loop block"]; - subgraph cluster_16 { - color=blue - 57 [label="Enter block"]; - 58 [label="Access variable R|/|"]; - 59 [label="Function call: R|/|.R|FakeOverride|()"]; - 60 [label="Stub" style="filled" fillcolor=gray]; - 61 [label="Variable declaration: lval result: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 62 [label="Access variable R|/result|" style="filled" fillcolor=gray]; - 63 [label="Stub" style="filled" fillcolor=gray]; - 64 [label="Assignmenet: R|/s|" style="filled" fillcolor=gray]; - subgraph cluster_17 { - color=blue - 65 [label="Enter when" style="filled" fillcolor=gray]; - subgraph cluster_18 { - color=blue - 66 [label="Enter when branch condition " style="filled" fillcolor=gray]; - 67 [label="Access variable R|/result|" style="filled" fillcolor=gray]; - 68 [label="Stub" style="filled" fillcolor=gray]; - 69 [label="Access variable #" style="filled" fillcolor=gray]; - 70 [label="Exit when branch condition" style="filled" fillcolor=gray]; - } - 71 [label="Synthetic else branch" style="filled" fillcolor=gray]; - 72 [label="Enter when branch result" style="filled" fillcolor=gray]; - subgraph cluster_19 { - color=blue - 73 [label="Enter block" style="filled" fillcolor=gray]; - 74 [label="Jump: break@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] " style="filled" fillcolor=gray]; - 75 [label="Stub" style="filled" fillcolor=gray]; - 76 [label="Exit block" style="filled" fillcolor=gray]; - } - 77 [label="Exit when branch result" style="filled" fillcolor=gray]; - 78 [label="Exit when" style="filled" fillcolor=gray]; - } - 79 [label="Exit block" style="filled" fillcolor=gray]; - } - 80 [label="Exit loop block" style="filled" fillcolor=gray]; - } - 81 [label="Exit whileloop"]; - } - 82 [label="Access variable R|/s|"]; - 83 [label="Enter safe call"]; - 84 [label="Postponed enter to lambda"]; - subgraph cluster_20 { - color=blue - 85 [label="Enter function anonymousFunction"]; - 86 [label="Access variable R|/it|"]; - 87 [label="Access variable R|/A.a|"]; - 88 [label="Exit function anonymousFunction"]; - } - 89 [label="Call arguments union" style="filled" fillcolor=yellow]; - 90 [label="Postponed exit from lambda"]; - 91 [label="Function call: R|/s|?.R|kotlin/let|(...)"]; - 92 [label="Exit safe call"]; - 93 [label="Exit function test_0" style="filled" fillcolor=red]; + 45 [label="Enter class A" style="filled" fillcolor=red]; + 46 [label="Exit class A" style="filled" fillcolor=red]; + } + + + 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|"]; + subgraph cluster_14 { + color=blue + 53 [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"]; + } + subgraph cluster_16 { + color=blue + 58 [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]; + subgraph cluster_18 { + color=blue + 67 [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]; + } + 73 [label="Synthetic else branch" style="filled" fillcolor=gray]; + 74 [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]; + } + 79 [label="Exit when branch result" style="filled" fillcolor=gray]; + 80 [label="Exit when" style="filled" fillcolor=gray]; + } + 81 [label="Exit block" style="filled" fillcolor=gray]; + } + 82 [label="Exit loop block" style="filled" fillcolor=gray]; + } + 83 [label="Exit whileloop"]; + } + 84 [label="Access variable R|/s|"]; + 85 [label="Enter safe call"]; + 86 [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"]; + } + 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]; } - 45 -> {46}; - 46 -> {47}; 47 -> {48}; 48 -> {49}; 49 -> {50}; @@ -233,46 +238,48 @@ digraph smartcastToNothing_kt { 52 -> {53}; 53 -> {54}; 54 -> {55}; - 55 -> {81 56}; + 55 -> {56}; 56 -> {57}; - 57 -> {58}; + 57 -> {83 58}; 58 -> {59}; - 59 -> {93}; - 59 -> {60} [style=dotted]; - 60 -> {61} [style=dotted]; + 59 -> {60}; + 60 -> {61}; + 61 -> {95}; 61 -> {62} [style=dotted]; - 62 -> {93 63} [style=dotted]; + 62 -> {63} [style=dotted]; 63 -> {64} [style=dotted]; - 64 -> {65} [style=dotted]; + 64 -> {95 65} [style=dotted]; 65 -> {66} [style=dotted]; 66 -> {67} [style=dotted]; - 67 -> {93 68} [style=dotted]; + 67 -> {68} [style=dotted]; 68 -> {69} [style=dotted]; - 69 -> {70} [style=dotted]; - 70 -> {72 71} [style=dotted]; - 71 -> {78} [style=dotted]; - 72 -> {73} [style=dotted]; - 73 -> {74} [style=dotted]; - 74 -> {81 75} [style=dotted]; + 69 -> {95 70} [style=dotted]; + 70 -> {71} [style=dotted]; + 71 -> {72} [style=dotted]; + 72 -> {74 73} [style=dotted]; + 73 -> {80} [style=dotted]; + 74 -> {75} [style=dotted]; 75 -> {76} [style=dotted]; - 76 -> {77} [style=dotted]; + 76 -> {83 77} [style=dotted]; 77 -> {78} [style=dotted]; 78 -> {79} [style=dotted]; 79 -> {80} [style=dotted]; - 80 -> {52} [style=dotted]; - 81 -> {82}; - 82 -> {83 92}; + 80 -> {81} [style=dotted]; + 81 -> {82} [style=dotted]; + 82 -> {54} [style=dotted]; 83 -> {84}; - 84 -> {85}; - 84 -> {90} [color=red]; + 84 -> {85 94}; 85 -> {86}; 86 -> {87}; + 86 -> {92} [color=red]; 87 -> {88}; - 88 -> {90} [color=green]; - 88 -> {89} [color=red]; - 89 -> {91} [color=red]; - 90 -> {91} [color=green]; - 91 -> {92}; - 92 -> {93} [style=dotted]; + 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]; } 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 7e34ee23880..e489591d644 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot @@ -33,104 +33,119 @@ digraph overridenOpenVal_kt { subgraph cluster_3 { color=red - 8 [label="Enter function " style="filled" fillcolor=red]; - 9 [label="Access variable R|/x|"]; - 10 [label="Delegated constructor call: super(...)"]; - 11 [label="Exit function " style="filled" fillcolor=red]; + 8 [label="Enter class A" style="filled" fillcolor=red]; + 9 [label="Exit class A" style="filled" fillcolor=red]; } - 8 -> {9}; - 9 -> {10}; - 10 -> {11}; subgraph cluster_4 { color=red - 12 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_5 { - color=blue - 13 [label="Enter when"]; - subgraph cluster_6 { - color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Access variable R|/A.x|"]; - 16 [label="Type operator: (this@R|/B|.R|/A.x| is R|kotlin/String|)"]; - 17 [label="Exit when branch condition"]; - } - 18 [label="Synthetic else branch"]; - 19 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 20 [label="Enter block"]; - 21 [label="Access variable R|/A.x|"]; - 22 [label="Access variable R|kotlin/String.length|"]; - 23 [label="Exit block"]; - } - 24 [label="Exit when branch result"]; - 25 [label="Exit when"]; - } - 26 [label="Exit function test_1" style="filled" fillcolor=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]; } + 10 -> {11}; + 11 -> {12}; 12 -> {13}; - 13 -> {14}; + + subgraph cluster_5 { + color=red + 14 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_6 { + color=blue + 15 [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"]; + } + 20 [label="Synthetic else branch"]; + 21 [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"]; + } + 26 [label="Exit when branch result"]; + 27 [label="Exit when"]; + } + 28 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {19 18}; - 18 -> {25}; - 19 -> {20}; - 20 -> {21}; + 17 -> {18}; + 18 -> {19}; + 19 -> {21 20}; + 20 -> {27}; 21 -> {22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; + 26 -> {27}; + 27 -> {28}; - subgraph cluster_8 { + subgraph cluster_9 { color=red - 27 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_9 { - color=blue - 28 [label="Enter when"]; - subgraph cluster_10 { - color=blue - 29 [label="Enter when branch condition "]; - 30 [label="Access variable R|/b|"]; - 31 [label="Access variable R|/A.x|"]; - 32 [label="Type operator: (R|/b|.R|/A.x| is R|kotlin/String|)"]; - 33 [label="Exit when branch condition"]; - } - 34 [label="Synthetic else branch"]; - 35 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 36 [label="Enter block"]; - 37 [label="Access variable R|/b|"]; - 38 [label="Access variable R|/A.x|"]; - 39 [label="Access variable R|kotlin/String.length|"]; - 40 [label="Exit block"]; - } - 41 [label="Exit when branch result"]; - 42 [label="Exit when"]; - } - 43 [label="Exit function test_2" style="filled" fillcolor=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 { + color=red + 31 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 32 [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"]; + } + 38 [label="Synthetic else branch"]; + 39 [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"]; + } + 45 [label="Exit when branch result"]; + 46 [label="Exit when"]; + } + 47 [label="Exit function test_2" style="filled" fillcolor=red]; } - 27 -> {28}; - 28 -> {29}; - 29 -> {30}; - 30 -> {31}; 31 -> {32}; 32 -> {33}; - 33 -> {35 34}; - 34 -> {42}; + 33 -> {34}; + 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {38}; - 38 -> {39}; + 37 -> {39 38}; + 38 -> {46}; 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; + 43 -> {44}; + 44 -> {45}; + 45 -> {46}; + 46 -> {47}; } 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 44420933d7f..d4a2e26d0d5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot @@ -23,65 +23,71 @@ digraph delayedAssignment_kt { subgraph cluster_2 { color=red - 5 [label="Enter function test" style="filled" fillcolor=red]; - 6 [label="Variable declaration: lval a: R|A?|"]; - subgraph cluster_3 { - color=blue - 7 [label="Enter when"]; - subgraph cluster_4 { - color=blue - 8 [label="Enter when branch condition "]; - 9 [label="Access variable R|/b|"]; - 10 [label="Exit when branch condition"]; - } - subgraph cluster_5 { - color=blue - 11 [label="Enter when branch condition else"]; - 12 [label="Exit when branch condition"]; - } - 13 [label="Enter when branch result"]; - subgraph cluster_6 { - color=blue - 14 [label="Enter block"]; - 15 [label="Const: Null(null)"]; - 16 [label="Assignmenet: R|/a|"]; - 17 [label="Exit block"]; - } - 18 [label="Exit when branch result"]; - 19 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 20 [label="Enter block"]; - 21 [label="Function call: R|/A.A|()"]; - 22 [label="Assignmenet: R|/a|"]; - 23 [label="Access variable R|/a|"]; - 24 [label="Function call: R|/a|.R|/A.foo|()"]; - 25 [label="Exit block"]; - } - 26 [label="Exit when branch result"]; - 27 [label="Exit when"]; - } - 28 [label="Access variable R|/a|"]; - 29 [label="Function call: R|/a|.#()"]; - 30 [label="Exit function test" style="filled" fillcolor=red]; + 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?|"]; + subgraph cluster_4 { + color=blue + 9 [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"]; + } + subgraph cluster_6 { + color=blue + 13 [label="Enter when branch condition else"]; + 14 [label="Exit when branch condition"]; + } + 15 [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"]; + } + 20 [label="Exit when branch result"]; + 21 [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"]; + } + 28 [label="Exit when branch result"]; + 29 [label="Exit when"]; + } + 30 [label="Access variable R|/a|"]; + 31 [label="Function call: R|/a|.#()"]; + 32 [label="Exit function test" style="filled" fillcolor=red]; } - 5 -> {6}; - 6 -> {7}; 7 -> {8}; 8 -> {9}; 9 -> {10}; - 10 -> {19 11}; + 10 -> {11}; 11 -> {12}; - 12 -> {13}; + 12 -> {21 13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; - 18 -> {27}; + 18 -> {19}; 19 -> {20}; - 20 -> {21}; + 20 -> {29}; 21 -> {22}; 22 -> {23}; 23 -> {24}; @@ -91,5 +97,7 @@ digraph delayedAssignment_kt { 27 -> {28}; 28 -> {29}; 29 -> {30}; + 30 -> {31}; + 31 -> {32}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot index e4055329a54..8042ca1a7eb 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot @@ -15,164 +15,195 @@ digraph delegateWithAnonymousObject_kt { subgraph cluster_1 { color=red - 3 [label="Enter function delegate" style="filled" fillcolor=red]; - 4 [label="Const: Null(null)"]; - 5 [label="Check not null: Null(null)!!"]; - 6 [label="Jump: ^delegate Null(null)!!"]; - 7 [label="Stub" style="filled" fillcolor=gray]; - 8 [label="Exit function delegate" style="filled" fillcolor=red]; + 3 [label="Enter class DelegateProvider" style="filled" fillcolor=red]; + 4 [label="Exit class DelegateProvider" style="filled" fillcolor=red]; } - 3 -> {4}; - 4 -> {5}; - 5 -> {6}; - 6 -> {8}; - 6 -> {7} [style=dotted]; - 7 -> {8} [style=dotted]; + 3 -> {4} [color=green]; subgraph cluster_2 { color=red - 9 [label="Enter function " style="filled" fillcolor=red]; - 10 [label="Delegated constructor call: super|>()"]; - 11 [label="Exit function " style="filled" fillcolor=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]; } - 9 -> {10}; - 10 -> {11}; + 5 -> {6}; + 6 -> {7}; + 7 -> {8}; + 8 -> {10}; + 8 -> {9} [style=dotted]; + 9 -> {10} [style=dotted]; subgraph cluster_3 { color=red - 12 [label="Enter function updateFrom" style="filled" fillcolor=red]; - 13 [label="Exit function updateFrom" style="filled" fillcolor=red]; + 11 [label="Enter function " style="filled" fillcolor=red]; + 12 [label="Delegated constructor call: super|>()"]; + 13 [label="Exit function " style="filled" fillcolor=red]; } + 11 -> {12}; 12 -> {13}; subgraph cluster_4 { color=red - 14 [label="Enter function " style="filled" fillcolor=red]; - 15 [label="Delegated constructor call: super|>()"]; - 16 [label="Exit function " style="filled" fillcolor=red]; + 14 [label="Enter function updateFrom" style="filled" fillcolor=red]; + 15 [label="Exit function updateFrom" style="filled" fillcolor=red]; } 14 -> {15}; - 15 -> {16}; subgraph cluster_5 { color=red - 17 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 18 [label="Exit anonymous object"]; - 19 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 16 [label="Enter class IssueListView" style="filled" fillcolor=red]; + 17 [label="Exit class IssueListView" style="filled" fillcolor=red]; } - 17 -> {18}; - 18 -> {19}; + 16 -> {17} [color=green]; subgraph cluster_6 { color=red - 20 [label="Enter function " style="filled" fillcolor=red]; - 21 [label="Delegated constructor call: super()"]; - 22 [label="Exit function " style="filled" fillcolor=red]; + 18 [label="Enter function " style="filled" fillcolor=red]; + 19 [label="Delegated constructor call: super|>()"]; + 20 [label="Exit function " style="filled" fillcolor=red]; } - 20 -> {21}; - 21 -> {22}; + 18 -> {19}; + 19 -> {20}; subgraph cluster_7 { color=red - 23 [label="Enter function getValue" style="filled" fillcolor=red]; - 24 [label="Function call: R|/IssueListView.IssueListView|()"]; - 25 [label="Jump: ^getValue R|/IssueListView.IssueListView|()"]; - 26 [label="Stub" style="filled" fillcolor=gray]; - 27 [label="Exit function getValue" style="filled" fillcolor=red]; + 21 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + 22 [label="Exit anonymous object"]; + 23 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - 23 -> {24}; - 24 -> {25}; - 25 -> {27}; - 25 -> {26} [style=dotted]; - 26 -> {27} [style=dotted]; + 21 -> {22}; + 22 -> {23}; subgraph cluster_8 { color=red - 28 [label="Enter function setValue" style="filled" fillcolor=red]; - 29 [label="Function call: R|/IssueListView.IssueListView|()"]; - 30 [label="Access variable R|/value|"]; - 31 [label="Function call: R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(...)"]; - 32 [label="Jump: ^setValue R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(R|/value|)"]; - 33 [label="Stub" style="filled" fillcolor=gray]; - 34 [label="Exit function setValue" style="filled" fillcolor=red]; + 24 [label="Enter function " style="filled" fillcolor=red]; + 25 [label="Delegated constructor call: super()"]; + 26 [label="Exit function " style="filled" fillcolor=red]; } - 28 -> {29}; - 29 -> {30}; - 30 -> {31}; - 31 -> {32}; - 32 -> {34}; - 32 -> {33} [style=dotted]; - 33 -> {34} [style=dotted]; + 24 -> {25}; + 25 -> {26}; subgraph cluster_9 { color=red - 35 [label="Enter function getter" style="filled" fillcolor=red]; - 36 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 37 [label="Access variable this@R|/IssuesListUserProfile|"]; - 38 [label="Function call: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; - 39 [label="Jump: ^ D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; - 40 [label="Stub" style="filled" fillcolor=gray]; - 41 [label="Exit function getter" style="filled" fillcolor=red]; + 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]; } - 35 -> {36}; - 36 -> {37}; - 37 -> {38}; - 38 -> {39}; - 39 -> {41}; - 39 -> {40} [style=dotted]; - 40 -> {41} [style=dotted]; + 27 -> {28}; + 28 -> {29}; + 29 -> {31}; + 29 -> {30} [style=dotted]; + 30 -> {31} [style=dotted]; subgraph cluster_10 { color=red - 42 [label="Enter function setter" style="filled" fillcolor=red]; - 43 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 44 [label="Access variable this@R|/IssuesListUserProfile|"]; - 45 [label="Access variable R|/issueListView|"]; - 46 [label="Function call: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; - 47 [label="Exit function setter" style="filled" fillcolor=red]; + 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]; } - 42 -> {43}; - 43 -> {44}; - 44 -> {45}; - 45 -> {46}; - 46 -> {47}; + 32 -> {33}; + 33 -> {34}; + 34 -> {35}; + 35 -> {36}; + 36 -> {38}; + 36 -> {37} [style=dotted]; + 37 -> {38} [style=dotted]; subgraph cluster_11 { color=red - 48 [label="Enter property" style="filled" fillcolor=red]; - 49 [label="Postponed enter to lambda"]; - 50 [label="Postponed exit from lambda"]; - 51 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; - 52 [label="Access variable this@R|/IssuesListUserProfile|"]; - 53 [label="Access variable this@R|/IssuesListUserProfile|"]; - 54 [label="Access variable this@R|/IssuesListUserProfile|"]; - 55 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...).#(...)"]; - 56 [label="Postponed enter to lambda"]; - 57 [label="Postponed exit from lambda"]; - 58 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; - 59 [label="Exit property" style="filled" fillcolor=red]; + 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} [color=green]; + 49 -> {50}; 50 -> {51}; 51 -> {52}; 52 -> {53}; - 53 -> {54}; + + subgraph cluster_14 { + 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]; + } + 54 -> {55}; - 55 -> {56}; - 56 -> {57 57} [color=green]; + 55 -> {56 56} [color=green]; + 56 -> {57}; 57 -> {58}; 58 -> {59}; + 59 -> {60}; + 60 -> {61}; + 61 -> {62}; + 62 -> {63 63} [color=green]; + 63 -> {64}; + 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]; + } + } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index bb492855b31..4fc1f81288d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -160,10 +160,31 @@ abstract class FirDataFlowAnalyzer( enterNode.flow = enterNode.flow.fork() } - // ----------------------------------- Anonymous object ----------------------------------- + // ----------------------------------- Classes ----------------------------------- - fun exitAnonymousObject(anonymousObject: FirAnonymousObject) { - graphBuilder.exitAnonymousObject(anonymousObject).mergeIncomingFlow() + fun enterClass() { + graphBuilder.enterClass() + } + + fun exitClass() { + graphBuilder.exitClass() + } + + fun exitRegularClass(klass: FirRegularClass): ControlFlowGraph { + if (klass.isLocal) return exitLocalClass(klass) + return graphBuilder.exitClass(klass) + } + + private fun exitLocalClass(klass: FirRegularClass): ControlFlowGraph { + val (node, controlFlowGraph) = graphBuilder.exitLocalClass(klass) + node.mergeIncomingFlow() + return controlFlowGraph + } + + fun exitAnonymousObject(anonymousObject: FirAnonymousObject): ControlFlowGraph { + val (node, controlFlowGraph) = graphBuilder.exitAnonymousObject(anonymousObject) + node.mergeIncomingFlow() + return controlFlowGraph } // ----------------------------------- Property ----------------------------------- diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt index cd2f53aa9f9..369b5aea871 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt @@ -135,13 +135,13 @@ class UnionFunctionCallArgumentsNode(owner: ControlFlowGraph, override val fir: // ----------------------------------- Classes ----------------------------------- -class ClassEnterNode(owner: ControlFlowGraph, override val fir: FirClass<*>, level: Int, id: Int) : CFGNode>(owner, level, id) { +class ClassEnterNode(owner: ControlFlowGraph, override val fir: FirClass<*>, level: Int, id: Int) : CFGNode>(owner, level, id), EnterNodeMarker { override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitClassEnterNode(this, data) } } -class ClassExitNode(owner: ControlFlowGraph, override val fir: FirClass<*>, level: Int, id: Int) : CFGNode>(owner, level, id) { +class ClassExitNode(owner: ControlFlowGraph, override val fir: FirClass<*>, level: Int, id: Int) : CFGNode>(owner, level, id), ExitNodeMarker { override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitClassExitNode(this, data) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index 3e2558cf91f..a00cd882fa8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -68,33 +68,6 @@ class ControlFlowGraphBuilder { // ----------------------------------- Named function ----------------------------------- - fun prepareForLocalClassMembers(members: Collection>) { - members.forEachFunction { - enterToLocalClassesMembers[it.symbol] = lastNodes.topOrNull() - } - } - - fun cleanAfterForLocalClassMembers(members: Collection>) { - members.forEachFunction { - enterToLocalClassesMembers.remove(it.symbol) - } - } - - private inline fun Collection>.forEachFunction(block: (FirFunction<*>) -> Unit) { - for (member in this) { - for (function in member.unwrap()) { - block(function) - } - } - } - - private fun FirCallableMemberDeclaration<*>.unwrap(): List> = - when (this) { - is FirFunction<*> -> listOf(this) - is FirProperty -> listOfNotNull(this.getter, this.setter) - else -> emptyList() - } - /* * Second argument of pair is not null only if function is local and it is a * previous node before function declaration @@ -233,13 +206,83 @@ class ControlFlowGraphBuilder { return enterNode to exitNode } - // ----------------------------------- Anonymous object ----------------------------------- + // ----------------------------------- Classes ----------------------------------- - fun exitAnonymousObject(anonymousObject: FirAnonymousObject): AnonymousObjectExitNode { - return createAnonymousObjectExitNode(anonymousObject).also { + fun enterClass() { + levelCounter++ + } + + fun exitClass() { + levelCounter-- + } + + fun exitClass(klass: FirClass<*>): ControlFlowGraph { + exitClass() + val name = when (klass) { + is FirAnonymousObject -> "" + is FirRegularClass -> { + klass.name.asString() + } + else -> throw IllegalArgumentException("Unknown class kind: ${klass::class}") + } + graphs.push(ControlFlowGraph(klass, name, ControlFlowGraph.Kind.ClassInitializer)) + var node: CFGNode<*> = createClassEnterNode(klass) + for (declaration in klass.declarations) { + val graph = when (declaration) { + is FirProperty -> declaration.controlFlowGraphReference.controlFlowGraph + is FirAnonymousInitializer -> declaration.controlFlowGraphReference.controlFlowGraph + else -> null + } ?: continue + addEdge(node, graph.enterNode, preferredKind = EdgeKind.Cfg) + node = graph.exitNode + } + val exitNode = createClassExitNode(klass) + addEdge(node, exitNode, preferredKind = EdgeKind.Cfg) + return graphs.pop() + } + + fun prepareForLocalClassMembers(members: Collection>) { + members.forEachFunction { + enterToLocalClassesMembers[it.symbol] = lastNodes.topOrNull() + } + } + + fun cleanAfterForLocalClassMembers(members: Collection>) { + members.forEachFunction { + enterToLocalClassesMembers.remove(it.symbol) + } + } + + private inline fun Collection>.forEachFunction(block: (FirFunction<*>) -> Unit) { + for (member in this) { + for (function in member.unwrap()) { + block(function) + } + } + } + + private fun FirCallableMemberDeclaration<*>.unwrap(): List> = + when (this) { + is FirFunction<*> -> listOf(this) + is FirProperty -> listOfNotNull(this.getter, this.setter) + else -> emptyList() + } + + fun exitLocalClass(klass: FirRegularClass): Pair { + val graph = exitClass(klass) + val node = createLocalClassExitNode(klass).also { + addNewSimpleNode(it) + } + return node to graph + } + + fun exitAnonymousObject(anonymousObject: FirAnonymousObject): Pair { + val graph = exitClass(anonymousObject) + val node = createAnonymousObjectExitNode(anonymousObject).also { // Hack for initializers of enum entries addNewSimpleNodeIfPossible(it) } + return node to graph } // ----------------------------------- Block ----------------------------------- @@ -761,7 +804,7 @@ class ControlFlowGraphBuilder { fun enterInitBlock(initBlock: FirAnonymousInitializer): Pair?> { val lastNode = lastNodes.topOrNull() - graphs.push(ControlFlowGraph(initBlock, "init block", ControlFlowGraph.Kind.ClassInitializer)) + graphs.push(ControlFlowGraph(initBlock, "init block", ControlFlowGraph.Kind.Function)) val enterNode = createInitBlockEnterNode(initBlock).also { lexicalScopes.push(stackOf(it)) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphRenderer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphRenderer.kt index 765ab16dd8b..6c8efc10e52 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphRenderer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphRenderer.kt @@ -42,6 +42,7 @@ class FirControlFlowGraphRenderVisitor( private var indexOffset = 0 private var clusterCounter = 0 + private val indices = mutableMapOf, Int>() override fun visitFile(file: FirFile) { printer @@ -82,7 +83,7 @@ class FirControlFlowGraphRenderVisitor( with(printer) { val graph = this@dotRenderToStringBuilder val sortedNodes = graph.sortNodes() - val indices = sortedNodes.indicesMap().mapValues { (_, index) -> index + indexOffset } + sortedNodes.indicesMap().mapValuesTo(indices) { (_, index) -> index + indexOffset } var color = RED sortedNodes.forEach { @@ -117,7 +118,7 @@ class FirControlFlowGraphRenderVisitor( if (node.followingNodes.isEmpty()) return@forEachIndexed fun renderEdges(kind: EdgeKind) { - val edges = node.followingNodes.filter { node.outgoingEdges.getValue(it) == kind } + val edges = node.followingNodes.filter { node.outgoingEdges.getValue(it) == kind && it.owner == graph } if (edges.isEmpty()) return print( i + indexOffset, @@ -224,11 +225,14 @@ private fun CFGNode<*>.render(): String = is PostponedLambdaEnterNode -> "Postponed enter to lambda" is PostponedLambdaExitNode -> "Postponed exit from lambda" - is AnonymousObjectExitNode -> "Exit anonymous object" - is UnionFunctionCallArgumentsNode -> "Call arguments union" - else -> TODO(this@render.toString()) + is ClassEnterNode -> "Enter class ${owner.name}" + is ClassExitNode -> "Exit class ${owner.name}" + is LocalClassExitNode -> "Exit local class ${owner.name}" + is AnonymousObjectExitNode -> "Exit anonymous object" + + is AbstractBinaryExitNode -> throw IllegalStateException() }, ) } @@ -249,14 +253,16 @@ private fun FirLoop.type(): String = when (this) { } private fun ControlFlowGraph.sortNodes(): List> { - return DFS.topologicalOrder(nodes) { + val nodesToSort = nodes.filter { it != enterNode } + val topologicalOrder = DFS.topologicalOrder(nodesToSort) { val result = if (it !is WhenBranchConditionExitNode || it.followingNodes.size < 2) { it.followingNodes } else { it.followingNodes.sortedBy { node -> if (node is BlockEnterNode) 1 else 0 } - } + }.filter { it.owner == this } result } + return listOf(enterNode) + topologicalOrder } private fun List>.indicesMap(): Map, Int> = mapIndexed { i, node -> node to i }.toMap() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 1bf41282615..376ac663a4c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -273,11 +273,12 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): CompositeTransformResult { context.storeClass(regularClass) - if (regularClass.symbol.classId.isLocal && regularClass !in context.targetedLocalClasses) { + if (regularClass.isLocal && regularClass !in context.targetedLocalClasses) { return regularClass.runAllPhasesForLocalClass(components, data).compose() } return withTypeParametersOf(regularClass) { + dataFlowAnalyzer.enterClass() val oldConstructorScope = primaryConstructorParametersScope val oldContainingClass = containingClass primaryConstructorParametersScope = null @@ -292,12 +293,18 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) scope } } - transformDeclarationContent(regularClass, data) + transformDeclarationContent(regularClass, data).single as FirRegularClass + } + if (!implicitTypeOnly) { + val controlFlowGraph = dataFlowAnalyzer.exitRegularClass(result) + result.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, controlFlowGraph) + } else { + dataFlowAnalyzer.exitClass() } containingClass = oldContainingClass primaryConstructorParametersScope = oldConstructorScope @Suppress("UNCHECKED_CAST") - result as CompositeTransformResult + result.compose() } } @@ -308,18 +315,22 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer) if (anonymousObject !in context.targetedLocalClasses) { return anonymousObject.runAllPhasesForLocalClass(components, data).compose() } - + dataFlowAnalyzer.enterClass() val type = anonymousObject.defaultType() anonymousObject.resultType = buildResolvedTypeRef { source = anonymousObject.source this.type = type } - val result = withLabelAndReceiverType(null, anonymousObject, type) { - transformDeclarationContent(anonymousObject, data) + var result = withLabelAndReceiverType(null, anonymousObject, type) { + transformDeclarationContent(anonymousObject, data).single as FirAnonymousObject } - dataFlowAnalyzer.exitAnonymousObject(result.single as FirAnonymousObject) - @Suppress("UNCHECKED_CAST") - return result as CompositeTransformResult + if (!implicitTypeOnly) { + val graph = dataFlowAnalyzer.exitAnonymousObject(result) + result = result.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, graph) + } else { + dataFlowAnalyzer.exitClass() + } + return result.compose() } private fun transformAnonymousFunctionWithLambdaResolution( diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt index 2c2156e6beb..b8ad3da5f47 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt @@ -61,6 +61,8 @@ inline val FirPropertyAccessor.visibility get() = status.visibility inline val FirPropertyAccessor.allowsToHaveFakeOverride: Boolean get() = !Visibilities.isPrivate(visibility) && this != Visibilities.INVISIBLE_FAKE +inline val FirRegularClass.isLocal get() = symbol.classId.isLocal + fun AbstractFirRegularClassBuilder.addDeclaration(declaration: FirDeclaration) { declarations += declaration if (companionObject == null && declaration is FirRegularClass && declaration.isCompanion) {