aadea0e26f
Interpretation: a graph A is a subgraph of B if information available at nodes of A depends on the paths taken in B. For example, local classes are subgraphs of a graph in which they are declared, and members of those classes are subgraphs of the local class itself - because these members can reference captured values. Consequences: * if graph G is a subgraph of node N, then G is a subgraph of N's owner; * `ControlFlowAnalysisDiagnosticComponent` will only visit root graphs; * `graph.traverse` will ignore subgraph boundaries, as if all subgraphs are inlined into one huge root graph; * if a control flow checker needs information from a declaration to which a graph is attached, it must look at subgraphs explicitly. For example, consider the `callsInPlace` checker. When a function has a `callsInPlace` contract and a local declaration, the checker must visit that local declaration to ensure it does not capture the allegedly called-in-place argument - hence `graph.traverse` will look at the nodes. However, the local declaration can also be a function with its own `callsInPlace` contracts, so the checker should also run for it in isolation. If that sounds quadratic, that's because unfortunately it is.
101 lines
3.2 KiB
Plaintext
Vendored
101 lines
3.2 KiB
Plaintext
Vendored
digraph secondaryConstructorCfg_kt {
|
|
graph [nodesep=3]
|
|
node [shape=box penwidth=2]
|
|
edge [penwidth=2]
|
|
|
|
subgraph cluster_0 {
|
|
color=red
|
|
0 [label="Enter function <init>" style="filled" fillcolor=red];
|
|
1 [label="Delegated constructor call: super<R|kotlin/Any|>()" style="filled" fillcolor=yellow];
|
|
2 [label="Exit function <init>" style="filled" fillcolor=red];
|
|
}
|
|
0 -> {1};
|
|
1 -> {2};
|
|
|
|
subgraph cluster_1 {
|
|
color=red
|
|
10 [label="Enter function <init>" style="filled" fillcolor=red];
|
|
11 [label="Access variable R|<local>/p0|"];
|
|
12 [label="Delegated constructor call: this<R|B|>(...)" style="filled" fillcolor=yellow];
|
|
subgraph cluster_2 {
|
|
color=blue
|
|
13 [label="Enter block"];
|
|
14 [label="Access variable R|<local>/p1|"];
|
|
15 [label="Assignment: R|/B.p3|"];
|
|
16 [label="Exit block"];
|
|
}
|
|
17 [label="Exit function <init>" style="filled" fillcolor=red];
|
|
}
|
|
10 -> {11};
|
|
11 -> {12};
|
|
12 -> {13};
|
|
13 -> {14};
|
|
14 -> {15};
|
|
15 -> {16};
|
|
16 -> {17};
|
|
|
|
subgraph cluster_3 {
|
|
color=red
|
|
27 [label="Enter class B" style="filled" fillcolor=red];
|
|
28 [label="Part of class initialization"];
|
|
subgraph cluster_4 {
|
|
color=blue
|
|
3 [label="Enter property" style="filled" fillcolor=red];
|
|
4 [label="Access variable R|<local>/p0|"];
|
|
5 [label="Exit property" style="filled" fillcolor=red];
|
|
}
|
|
29 [label="Part of class initialization"];
|
|
subgraph cluster_5 {
|
|
color=blue
|
|
6 [label="Enter property" style="filled" fillcolor=red];
|
|
7 [label="Access variable R|<local>/p0|"];
|
|
8 [label="Access variable R|kotlin/String.length|"];
|
|
9 [label="Exit property" style="filled" fillcolor=red];
|
|
}
|
|
30 [label="Part of class initialization"];
|
|
subgraph cluster_6 {
|
|
color=blue
|
|
18 [label="Enter init block" style="filled" fillcolor=red];
|
|
subgraph cluster_7 {
|
|
color=blue
|
|
19 [label="Enter block"];
|
|
20 [label="Access variable R|<local>/p0|"];
|
|
21 [label="Access variable R|kotlin/String.length|"];
|
|
22 [label="Assignment: R|/B.p1|"];
|
|
23 [label="Const: String()"];
|
|
24 [label="Assignment: R|/B.p3|"];
|
|
25 [label="Exit block"];
|
|
}
|
|
26 [label="Exit init block" style="filled" fillcolor=red];
|
|
}
|
|
31 [label="Exit class B" style="filled" fillcolor=red];
|
|
}
|
|
27 -> {28} [color=green];
|
|
28 -> {3} [color=green];
|
|
28 -> {29} [style=dotted];
|
|
28 -> {3} [style=dashed];
|
|
29 -> {6} [color=green];
|
|
29 -> {30} [style=dotted];
|
|
29 -> {6} [style=dashed];
|
|
30 -> {18} [color=green];
|
|
30 -> {31} [style=dotted];
|
|
30 -> {18} [style=dashed];
|
|
3 -> {4};
|
|
4 -> {5};
|
|
5 -> {29} [color=green];
|
|
6 -> {7};
|
|
7 -> {8};
|
|
8 -> {9};
|
|
9 -> {30} [color=green];
|
|
18 -> {19};
|
|
19 -> {20};
|
|
20 -> {21};
|
|
21 -> {22};
|
|
22 -> {23};
|
|
23 -> {24};
|
|
24 -> {25};
|
|
25 -> {26};
|
|
26 -> {31} [color=green];
|
|
|
|
}
|