[FIR] Don't use psi for rendering control flow graph

This commit is contained in:
Dmitriy Novozhilov
2020-02-12 18:01:03 +03:00
parent a4b53b4a20
commit 28c95b1108
26 changed files with 130 additions and 131 deletions
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirLoop
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.dfa.FirControlFlowGraphReferenceImpl
@@ -160,7 +159,7 @@ private fun CFGNode<*>.render(): String =
is QualifiedAccessNode -> "Access variable ${fir.calleeReference.render()}"
is OperatorCallNode -> "Operator ${fir.operation.operator}"
is TypeOperatorCallNode -> "Type operator: \"${fir.psi?.text?.toString() ?: fir.render()}\""
is TypeOperatorCallNode -> "Type operator: \"${fir.render()}\""
is JumpNode -> "Jump: ${fir.render()}"
is StubNode -> "Stub"
is CheckNotNullCallNode -> "Check not null: ${fir.render()}"
+1 -1
View File
@@ -200,7 +200,7 @@ digraph complex_kt {
color=blue
66 [label="Enter when branch condition "];
67 [label="Access variable R|<local>/element|"];
68 [label="Type operator: element is T"];
68 [label="Type operator: (R|<local>/element| is R|T|)"];
69 [label="Exit when branch condition"];
}
70 [label="Synthetic else branch"];
+2 -2
View File
@@ -165,7 +165,7 @@ digraph jumps_kt {
color=blue
58 [label="Enter block"];
59 [label="Access variable R|<local>/x|"];
60 [label="Type operator: x as Int"];
60 [label="Type operator: (R|<local>/x| as R|kotlin/Int|)"];
61 [label="Jump: break@@@[Boolean(true)] "];
62 [label="Stub" style="filled" fillcolor=gray];
63 [label="Exit block" style="filled" fillcolor=gray];
@@ -211,7 +211,7 @@ digraph jumps_kt {
color=blue
72 [label="Enter block"];
73 [label="Access variable R|<local>/x|"];
74 [label="Type operator: x as Int"];
74 [label="Type operator: (R|<local>/x| as R|kotlin/Int|)"];
75 [label="Jump: break@@@[Boolean(true)] "];
76 [label="Stub" style="filled" fillcolor=gray];
77 [label="Exit block" style="filled" fillcolor=gray];
+2 -2
View File
@@ -23,7 +23,7 @@ digraph lambdas_kt {
color=blue
5 [label="Enter when branch condition "];
6 [label="Access variable R|<local>/x|"];
7 [label="Type operator: x is Int"];
7 [label="Type operator: (R|<local>/x| is R|kotlin/Int|)"];
8 [label="Exit when branch condition"];
}
9 [label="Synthetic else branch"];
@@ -84,7 +84,7 @@ digraph lambdas_kt {
color=blue
25 [label="Enter when branch condition "];
26 [label="Access variable R|<local>/x|"];
27 [label="Type operator: x is Int"];
27 [label="Type operator: (R|<local>/x| is R|kotlin/Int|)"];
28 [label="Exit when branch condition"];
}
29 [label="Synthetic else branch"];
+6 -6
View File
@@ -22,7 +22,7 @@ digraph loops_kt {
color=blue
6 [label="Enter block"];
7 [label="Access variable R|<local>/x|"];
8 [label="Type operator: x is String"];
8 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
9 [label="Variable declaration: lval y: R|kotlin/Boolean|"];
10 [label="Exit block"];
}
@@ -31,7 +31,7 @@ digraph loops_kt {
12 [label="Exit whileloop"];
}
13 [label="Access variable R|<local>/x|"];
14 [label="Type operator: x is String"];
14 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
15 [label="Exit function testWhile" style="filled" fillcolor=red];
}
@@ -64,7 +64,7 @@ digraph loops_kt {
color=blue
19 [label="Enter block"];
20 [label="Access variable R|<local>/x|"];
21 [label="Type operator: x is String"];
21 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
22 [label="Variable declaration: lval y: R|kotlin/Boolean|"];
23 [label="Exit block"];
}
@@ -79,7 +79,7 @@ digraph loops_kt {
28 [label="Exit do-whileloop"];
}
29 [label="Access variable R|<local>/x|"];
30 [label="Type operator: x is String"];
30 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
31 [label="Exit function testDoWhile" style="filled" fillcolor=red];
}
@@ -129,7 +129,7 @@ digraph loops_kt {
48 [label="Function call: R|<local>/<iterator>|.R|kotlin/collections/IntIterator.next|()"];
49 [label="Variable declaration: lval i: R|kotlin/Int|"];
50 [label="Access variable R|<local>/x|"];
51 [label="Type operator: x is String"];
51 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
52 [label="Variable declaration: lval y: R|kotlin/Boolean|"];
53 [label="Exit block"];
}
@@ -138,7 +138,7 @@ digraph loops_kt {
55 [label="Exit whileloop"];
}
56 [label="Access variable R|<local>/x|"];
57 [label="Type operator: x is String"];
57 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
58 [label="Exit function testFor" style="filled" fillcolor=red];
}
+3 -3
View File
@@ -142,11 +142,11 @@ digraph when_kt {
color=blue
50 [label="Enter &&"];
51 [label="Access variable R|<local>/x|"];
52 [label="Type operator: x is A"];
52 [label="Type operator: (R|<local>/x| is R|A|)"];
53 [label="Exit left part of &&"];
54 [label="Enter right part of &&"];
55 [label="Access variable R|<local>/x|"];
56 [label="Type operator: x is B"];
56 [label="Type operator: (R|<local>/x| is R|B|)"];
57 [label="Exit &&"];
}
58 [label="Exit when branch condition"];
@@ -157,7 +157,7 @@ digraph when_kt {
color=blue
61 [label="Enter block"];
62 [label="Access variable R|<local>/x|"];
63 [label="Type operator: x is A"];
63 [label="Type operator: (R|<local>/x| is R|A|)"];
64 [label="Exit block"];
}
65 [label="Exit when branch result"];
@@ -48,11 +48,11 @@ digraph booleanOperators_kt {
color=blue
11 [label="Enter &&"];
12 [label="Access variable R|<local>/x|"];
13 [label="Type operator: x is B"];
13 [label="Type operator: (R|<local>/x| is R|B|)"];
14 [label="Exit left part of &&"];
15 [label="Enter right part of &&"];
16 [label="Access variable R|<local>/x|"];
17 [label="Type operator: x is C"];
17 [label="Type operator: (R|<local>/x| is R|C|)"];
18 [label="Exit &&"];
}
19 [label="Exit when branch condition"];
@@ -114,11 +114,11 @@ digraph booleanOperators_kt {
color=blue
36 [label="Enter ||"];
37 [label="Access variable R|<local>/x|"];
38 [label="Type operator: x is B"];
38 [label="Type operator: (R|<local>/x| is R|B|)"];
39 [label="Exit left part of ||"];
40 [label="Enter right part of ||"];
41 [label="Access variable R|<local>/x|"];
42 [label="Type operator: x is C"];
42 [label="Type operator: (R|<local>/x| is R|C|)"];
43 [label="Exit ||"];
}
44 [label="Exit when branch condition"];
@@ -177,7 +177,7 @@ digraph booleanOperators_kt {
color=blue
60 [label="Enter when branch condition "];
61 [label="Access variable R|<local>/x|"];
62 [label="Type operator: x !is A"];
62 [label="Type operator: (R|<local>/x| !is R|A|)"];
63 [label="Function call: (R|<local>/x| !is R|A|).R|kotlin/Boolean.not|()"];
64 [label="Exit when branch condition"];
}
@@ -225,7 +225,7 @@ digraph booleanOperators_kt {
color=blue
77 [label="Enter ||"];
78 [label="Access variable R|<local>/x|"];
79 [label="Type operator: x !is String"];
79 [label="Type operator: (R|<local>/x| !is R|kotlin/String|)"];
80 [label="Exit left part of ||"];
81 [label="Enter right part of ||"];
82 [label="Access variable R|<local>/x|"];
@@ -291,7 +291,7 @@ digraph booleanOperators_kt {
color=blue
102 [label="Enter &&"];
103 [label="Access variable R|<local>/x|"];
104 [label="Type operator: x is A"];
104 [label="Type operator: (R|<local>/x| is R|A|)"];
105 [label="Exit left part of &&"];
106 [label="Enter right part of &&"];
107 [label="Access variable R|<local>/x|"];
@@ -346,7 +346,7 @@ digraph booleanOperators_kt {
color=blue
122 [label="Enter when branch condition "];
123 [label="Access variable R|<local>/x|"];
124 [label="Type operator: x !is A"];
124 [label="Type operator: (R|<local>/x| !is R|A|)"];
125 [label="Function call: (R|<local>/x| !is R|A|).R|kotlin/Boolean.not|()"];
126 [label="Exit when branch condition"];
}
@@ -394,7 +394,7 @@ digraph booleanOperators_kt {
color=blue
139 [label="Enter ||"];
140 [label="Access variable R|<local>/x|"];
141 [label="Type operator: x is A"];
141 [label="Type operator: (R|<local>/x| is R|A|)"];
142 [label="Exit left part of ||"];
143 [label="Enter right part of ||"];
144 [label="Const: Boolean(false)"];
@@ -453,7 +453,7 @@ digraph booleanOperators_kt {
161 [label="Exit left part of ||"];
162 [label="Enter right part of ||"];
163 [label="Access variable R|<local>/x|"];
164 [label="Type operator: x is A"];
164 [label="Type operator: (R|<local>/x| is R|A|)"];
165 [label="Exit ||"];
}
166 [label="Exit when branch condition"];
@@ -507,7 +507,7 @@ digraph booleanOperators_kt {
color=blue
179 [label="Enter ||"];
180 [label="Access variable R|<local>/x|"];
181 [label="Type operator: x is A"];
181 [label="Type operator: (R|<local>/x| is R|A|)"];
182 [label="Exit left part of ||"];
183 [label="Enter right part of ||"];
184 [label="Const: Boolean(true)"];
@@ -566,7 +566,7 @@ digraph booleanOperators_kt {
201 [label="Exit left part of ||"];
202 [label="Enter right part of ||" style="filled" fillcolor=gray];
203 [label="Access variable R|<local>/x|" style="filled" fillcolor=gray];
204 [label="Type operator: x is A" style="filled" fillcolor=gray];
204 [label="Type operator: (R|<local>/x| is R|A|)" style="filled" fillcolor=gray];
205 [label="Exit ||"];
}
206 [label="Exit when branch condition"];
@@ -623,7 +623,7 @@ digraph booleanOperators_kt {
221 [label="Exit left part of &&"];
222 [label="Enter right part of &&" style="filled" fillcolor=gray];
223 [label="Access variable R|<local>/x|" style="filled" fillcolor=gray];
224 [label="Type operator: x is A" style="filled" fillcolor=gray];
224 [label="Type operator: (R|<local>/x| is R|A|)" style="filled" fillcolor=gray];
225 [label="Exit &&"];
}
226 [label="Exit when branch condition"];
@@ -677,7 +677,7 @@ digraph booleanOperators_kt {
color=blue
239 [label="Enter &&"];
240 [label="Access variable R|<local>/x|"];
241 [label="Type operator: x is A"];
241 [label="Type operator: (R|<local>/x| is R|A|)"];
242 [label="Exit left part of &&"];
243 [label="Enter right part of &&"];
244 [label="Const: Boolean(false)"];
@@ -736,7 +736,7 @@ digraph booleanOperators_kt {
261 [label="Exit left part of &&"];
262 [label="Enter right part of &&"];
263 [label="Access variable R|<local>/x|"];
264 [label="Type operator: x is A"];
264 [label="Type operator: (R|<local>/x| is R|A|)"];
265 [label="Exit &&"];
}
266 [label="Exit when branch condition"];
@@ -790,7 +790,7 @@ digraph booleanOperators_kt {
color=blue
279 [label="Enter &&"];
280 [label="Access variable R|<local>/x|"];
281 [label="Type operator: x is A"];
281 [label="Type operator: (R|<local>/x| is R|A|)"];
282 [label="Exit left part of &&"];
283 [label="Enter right part of &&"];
284 [label="Const: Boolean(false)"];
@@ -31,7 +31,7 @@ digraph boundSmartcasts_kt {
color=blue
8 [label="Enter when branch condition "];
9 [label="Access variable R|<local>/x|"];
10 [label="Type operator: x is A"];
10 [label="Type operator: (R|<local>/x| is R|A|)"];
11 [label="Exit when branch condition"];
}
12 [label="Synthetic else branch"];
@@ -82,7 +82,7 @@ digraph boundSmartcasts_kt {
color=blue
27 [label="Enter when branch condition "];
28 [label="Access variable R|<local>/y|"];
29 [label="Type operator: y is A"];
29 [label="Type operator: (R|<local>/y| is R|A|)"];
30 [label="Exit when branch condition"];
}
31 [label="Synthetic else branch"];
@@ -133,7 +133,7 @@ digraph boundSmartcasts_kt {
color=blue
46 [label="Enter when branch condition "];
47 [label="Access variable R|<local>/x|"];
48 [label="Type operator: x is A"];
48 [label="Type operator: (R|<local>/x| is R|A|)"];
49 [label="Exit when branch condition"];
}
50 [label="Synthetic else branch"];
@@ -157,7 +157,7 @@ digraph boundSmartcasts_kt {
color=blue
61 [label="Enter when branch condition "];
62 [label="Access variable R|<local>/y|"];
63 [label="Type operator: y is B"];
63 [label="Type operator: (R|<local>/y| is R|B|)"];
64 [label="Exit when branch condition"];
}
65 [label="Synthetic else branch"];
@@ -217,7 +217,7 @@ digraph boundSmartcasts_kt {
77 [label="Const: Int(1)"];
78 [label="Variable declaration: lvar x: R|kotlin/Any|"];
79 [label="Access variable R|<local>/x|"];
80 [label="Type operator: x as Int"];
80 [label="Type operator: (R|<local>/x| as R|kotlin/Int|)"];
81 [label="Access variable R|<local>/x|"];
82 [label="Function call: R|<local>/x|.R|kotlin/Int.inc|()"];
83 [label="Access variable R|<local>/y|"];
@@ -231,7 +231,7 @@ digraph boundSmartcasts_kt {
color=blue
88 [label="Enter when branch condition "];
89 [label="Access variable R|<local>/y|"];
90 [label="Type operator: y is A"];
90 [label="Type operator: (R|<local>/y| is R|A|)"];
91 [label="Exit when branch condition"];
}
92 [label="Synthetic else branch"];
@@ -359,7 +359,7 @@ digraph boundSmartcasts_kt {
139 [label="Access variable R|/D.any|"];
140 [label="Function call: R|<local>/d|.R|/D.any|.R|/baz|()"];
141 [label="Access variable R|<local>/a|"];
142 [label="Type operator: a as A"];
142 [label="Type operator: (R|<local>/a| as R|A|)"];
143 [label="Access variable R|<local>/a|"];
144 [label="Function call: R|<local>/a|.R|/A.foo|()"];
145 [label="Exit function test_5" style="filled" fillcolor=red];
@@ -407,7 +407,7 @@ digraph boundSmartcasts_kt {
148 [label="Access variable R|/D.any|"];
149 [label="Variable declaration: lval a: R|kotlin/Any?|"];
150 [label="Access variable R|<local>/a|"];
151 [label="Type operator: a as A"];
151 [label="Type operator: (R|<local>/a| as R|A|)"];
152 [label="Access variable R|<local>/a|"];
153 [label="Function call: R|<local>/a|.R|/A.foo|()"];
154 [label="Access variable R|<local>/d1|"];
@@ -448,11 +448,11 @@ digraph boundSmartcasts_kt {
170 [label="Exit safe call"];
171 [label="Variable declaration: lval b: R|kotlin/Any?|"];
172 [label="Access variable R|<local>/a|"];
173 [label="Type operator: a as A"];
173 [label="Type operator: (R|<local>/a| as R|A|)"];
174 [label="Access variable R|<local>/a|"];
175 [label="Function call: R|<local>/a|.R|/A.foo|()"];
176 [label="Access variable R|<local>/b|"];
177 [label="Type operator: b as B"];
177 [label="Type operator: (R|<local>/b| as R|B|)"];
178 [label="Access variable R|<local>/b|"];
179 [label="Function call: R|<local>/b|.R|/B.bar|()"];
180 [label="Exit function test_7" style="filled" fillcolor=red];
@@ -227,7 +227,7 @@ digraph boundSmartcastsInBranches_kt {
81 [label="Access variable R|<local>/a|"];
82 [label="Assignmenet: R|<local>/x|"];
83 [label="Access variable R|<local>/a|"];
84 [label="Type operator: a as A"];
84 [label="Type operator: (R|<local>/a| as R|A|)"];
85 [label="Exit block"];
}
86 [label="Exit when branch result"];
@@ -296,7 +296,7 @@ digraph boundSmartcastsInBranches_kt {
color=blue
106 [label="Enter block"];
107 [label="Access variable R|<local>/a|"];
108 [label="Type operator: a as A"];
108 [label="Type operator: (R|<local>/a| as R|A|)"];
109 [label="Access variable R|<local>/a|"];
110 [label="Assignmenet: R|<local>/x|"];
111 [label="Exit block"];
@@ -383,7 +383,7 @@ digraph boundSmartcastsInBranches_kt {
143 [label="Exit when"];
}
144 [label="Access variable R|<local>/x|"];
145 [label="Type operator: x as A"];
145 [label="Type operator: (R|<local>/x| as R|A|)"];
146 [label="Access variable R|<local>/x|"];
147 [label="Access variable R|/A.s|"];
148 [label="Access variable R|<local>/a|"];
@@ -458,7 +458,7 @@ digraph boundSmartcastsInBranches_kt {
171 [label="Exit when"];
}
172 [label="Access variable R|<local>/a|"];
173 [label="Type operator: a as A"];
173 [label="Type operator: (R|<local>/a| as R|A|)"];
174 [label="Access variable R|<local>/x|"];
175 [label="Access variable R|/A.s|"];
176 [label="Access variable R|<local>/a|"];
+7 -7
View File
@@ -7,7 +7,7 @@ digraph casts_kt {
color=red
0 [label="Enter function test_1" style="filled" fillcolor=red];
1 [label="Access variable R|<local>/x|"];
2 [label="Type operator: x as String"];
2 [label="Type operator: (R|<local>/x| as R|kotlin/String|)"];
3 [label="Access variable R|<local>/x|"];
4 [label="Access variable R|kotlin/String.length|"];
5 [label="Exit function test_1" style="filled" fillcolor=red];
@@ -29,7 +29,7 @@ digraph casts_kt {
color=blue
8 [label="Enter when branch condition "];
9 [label="Access variable R|<local>/x|"];
10 [label="Type operator: x as Boolean"];
10 [label="Type operator: (R|<local>/x| as R|kotlin/Boolean|)"];
11 [label="Exit when branch condition"];
}
12 [label="Synthetic else branch"];
@@ -82,7 +82,7 @@ digraph casts_kt {
28 [label="Exit left part of &&"];
29 [label="Enter right part of &&"];
30 [label="Access variable R|<local>/x|"];
31 [label="Type operator: x as Boolean"];
31 [label="Type operator: (R|<local>/x| as R|kotlin/Boolean|)"];
32 [label="Exit &&"];
}
33 [label="Exit when branch condition"];
@@ -114,7 +114,7 @@ digraph casts_kt {
48 [label="Exit left part of &&"];
49 [label="Enter right part of &&"];
50 [label="Access variable R|<local>/x|"];
51 [label="Type operator: x as Boolean"];
51 [label="Type operator: (R|<local>/x| as R|kotlin/Boolean|)"];
52 [label="Const: Boolean(true)"];
53 [label="Operator =="];
54 [label="Exit &&"];
@@ -148,7 +148,7 @@ digraph casts_kt {
70 [label="Exit left part of ||"];
71 [label="Enter right part of ||"];
72 [label="Access variable R|<local>/x|"];
73 [label="Type operator: x as Boolean"];
73 [label="Type operator: (R|<local>/x| as R|kotlin/Boolean|)"];
74 [label="Exit ||"];
}
75 [label="Exit when branch condition"];
@@ -244,7 +244,7 @@ digraph casts_kt {
color=blue
89 [label="Enter when branch condition "];
90 [label="Access variable R|<local>/b|"];
91 [label="Type operator: b as? Boolean"];
91 [label="Type operator: (R|<local>/b| as? R|kotlin/Boolean|)"];
92 [label="Const: Null(null)"];
93 [label="Operator !="];
94 [label="Exit when branch condition"];
@@ -283,7 +283,7 @@ digraph casts_kt {
color=blue
113 [label="Enter when branch condition "];
114 [label="Access variable R|<local>/b|"];
115 [label="Type operator: b as? Boolean"];
115 [label="Type operator: (R|<local>/b| as? R|kotlin/Boolean|)"];
116 [label="Const: Null(null)"];
117 [label="Operator =="];
118 [label="Exit when branch condition"];
@@ -140,7 +140,7 @@ digraph elvis_kt {
color=blue
45 [label="Enter when branch condition "];
46 [label="Access variable R|<local>/b|"];
47 [label="Type operator: b !is String"];
47 [label="Type operator: (R|<local>/b| !is R|kotlin/String|)"];
48 [label="Exit when branch condition"];
}
49 [label="Synthetic else branch"];
@@ -163,7 +163,7 @@ digraph elvis_kt {
color=blue
59 [label="Enter when branch condition "];
60 [label="Access variable R|<local>/a|"];
61 [label="Type operator: a !is String?"];
61 [label="Type operator: (R|<local>/a| !is R|kotlin/String?|)"];
62 [label="Exit when branch condition"];
}
63 [label="Synthetic else branch"];
@@ -13,7 +13,7 @@ digraph returns_kt {
color=blue
2 [label="Enter when branch condition "];
3 [label="Access variable R|<local>/x|"];
4 [label="Type operator: x is String"];
4 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
5 [label="Exit when branch condition"];
}
subgraph cluster_3 {
@@ -76,7 +76,7 @@ digraph returns_kt {
color=blue
24 [label="Enter when branch condition "];
25 [label="Access variable R|<local>/x|"];
26 [label="Type operator: x is String"];
26 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
27 [label="Exit when branch condition"];
}
subgraph cluster_9 {
@@ -168,14 +168,14 @@ digraph returns_kt {
color=blue
54 [label="Enter when branch condition "];
55 [label="Access variable R|<local>/x|"];
56 [label="Type operator: x is B"];
56 [label="Type operator: (R|<local>/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|<local>/x|"];
60 [label="Type operator: x is C"];
60 [label="Type operator: (R|<local>/x| is R|C|)"];
61 [label="Exit when branch condition"];
}
subgraph cluster_19 {
@@ -270,14 +270,14 @@ digraph returns_kt {
color=blue
92 [label="Enter when branch condition "];
93 [label="Access variable R|<local>/x|"];
94 [label="Type operator: x is B"];
94 [label="Type operator: (R|<local>/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|<local>/x|"];
98 [label="Type operator: x is C"];
98 [label="Type operator: (R|<local>/x| is R|C|)"];
99 [label="Exit when branch condition"];
}
100 [label="Synthetic else branch"];
@@ -383,7 +383,7 @@ digraph returns_kt {
color=red
133 [label="Enter function test_4" style="filled" fillcolor=red];
134 [label="Access variable R|<local>/a|"];
135 [label="Type operator: a as? String"];
135 [label="Type operator: (R|<local>/a| as? R|kotlin/String|)"];
136 [label="Variable declaration: lval s: R|kotlin/String?|"];
subgraph cluster_33 {
color=blue
@@ -13,7 +13,7 @@ digraph simpleIf_kt {
color=blue
2 [label="Enter when branch condition "];
3 [label="Access variable R|<local>/x|"];
4 [label="Type operator: x is String"];
4 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
5 [label="Exit when branch condition"];
}
6 [label="Synthetic else branch"];
@@ -54,7 +54,7 @@ digraph simpleIf_kt {
color=red
17 [label="Enter function test_2" style="filled" fillcolor=red];
18 [label="Access variable R|<local>/x|"];
19 [label="Type operator: x is String"];
19 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
20 [label="Variable declaration: lval b: R|kotlin/Boolean|"];
subgraph cluster_5 {
color=blue
@@ -111,14 +111,14 @@ digraph simpleIf_kt {
color=blue
38 [label="Enter when branch condition "];
39 [label="Access variable R|<local>/x|"];
40 [label="Type operator: x !is String"];
40 [label="Type operator: (R|<local>/x| !is R|kotlin/String|)"];
41 [label="Exit when branch condition"];
}
subgraph cluster_11 {
color=blue
42 [label="Enter when branch condition "];
43 [label="Access variable R|<local>/x|"];
44 [label="Type operator: x !is Int"];
44 [label="Type operator: (R|<local>/x| !is R|kotlin/Int|)"];
45 [label="Exit when branch condition"];
}
subgraph cluster_12 {
@@ -39,7 +39,7 @@ digraph smartcastFromArgument_kt {
color=blue
10 [label="Enter when"];
11 [label="Access variable R|<local>/a|"];
12 [label="Type operator: a as? A"];
12 [label="Type operator: (R|<local>/a| as? R|A|)"];
13 [label="Variable declaration: lval <elvis>: R|A?|"];
subgraph cluster_6 {
color=blue
@@ -29,14 +29,14 @@ digraph when_kt {
color=blue
6 [label="Enter when branch condition "];
7 [label="Access variable R|<local>/x|"];
8 [label="Type operator: x is A"];
8 [label="Type operator: (R|<local>/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|<local>/x|"];
12 [label="Type operator: x is B"];
12 [label="Type operator: (R|<local>/x| is R|B|)"];
13 [label="Exit when branch condition"];
}
14 [label="Synthetic else branch"];
@@ -67,21 +67,21 @@ digraph when_kt {
color=blue
29 [label="Enter when branch condition "];
30 [label="Access variable R|<local>/x|"];
31 [label="Type operator: x !is A"];
31 [label="Type operator: (R|<local>/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|<local>/x|"];
35 [label="Type operator: x !is B"];
35 [label="Type operator: (R|<local>/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|<local>/x|"];
39 [label="Type operator: x is Int"];
39 [label="Type operator: (R|<local>/x| is R|kotlin/Int|)"];
40 [label="Exit when branch condition"];
}
subgraph cluster_12 {
@@ -213,13 +213,13 @@ digraph when_kt {
subgraph cluster_19 {
color=blue
76 [label="Enter when branch condition "];
77 [label="Type operator: A"];
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: B"];
80 [label="Type operator: ($subj$ is R|B|)"];
81 [label="Exit when branch condition"];
}
82 [label="Synthetic else branch"];
@@ -250,19 +250,19 @@ digraph when_kt {
subgraph cluster_24 {
color=blue
98 [label="Enter when branch condition "];
99 [label="Type operator: A"];
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: B"];
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: Int"];
105 [label="Type operator: ($subj$ is R|kotlin/Int|)"];
106 [label="Exit when branch condition"];
}
subgraph cluster_27 {
@@ -392,13 +392,13 @@ digraph when_kt {
subgraph cluster_34 {
color=blue
143 [label="Enter when branch condition "];
144 [label="Type operator: A"];
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: B"];
147 [label="Type operator: ($subj$ is R|B|)"];
148 [label="Exit when branch condition"];
}
149 [label="Synthetic else branch"];
@@ -434,19 +434,19 @@ digraph when_kt {
subgraph cluster_39 {
color=blue
170 [label="Enter when branch condition "];
171 [label="Type operator: A"];
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: B"];
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: Int"];
177 [label="Type operator: ($subj$ is R|kotlin/Int|)"];
178 [label="Exit when branch condition"];
}
subgraph cluster_42 {
@@ -602,7 +602,7 @@ digraph when_kt {
color=blue
224 [label="Enter when"];
225 [label="Access variable R|<local>/x|"];
226 [label="Type operator: x as Int"];
226 [label="Type operator: (R|<local>/x| as R|kotlin/Int|)"];
subgraph cluster_49 {
color=blue
227 [label="Enter when branch condition "];
@@ -39,7 +39,7 @@ digraph inPlaceLambdas_kt {
color=blue
9 [label="Enter when branch condition "];
10 [label="Access variable R|<local>/x|"];
11 [label="Type operator: x is A"];
11 [label="Type operator: (R|<local>/x| is R|A|)"];
12 [label="Exit when branch condition"];
}
13 [label="Synthetic else branch"];
@@ -98,7 +98,7 @@ digraph inPlaceLambdas_kt {
color=blue
29 [label="Enter function anonymousFunction"];
30 [label="Access variable R|<local>/x|"];
31 [label="Type operator: x as B"];
31 [label="Type operator: (R|<local>/x| as R|B|)"];
32 [label="Exit function anonymousFunction"];
}
33 [label="Postponed exit from lambda"];
@@ -134,7 +134,7 @@ digraph inPlaceLambdas_kt {
color=blue
40 [label="Enter when branch condition "];
41 [label="Access variable R|<local>/x|"];
42 [label="Type operator: x is A"];
42 [label="Type operator: (R|<local>/x| is R|A|)"];
43 [label="Exit when branch condition"];
}
44 [label="Synthetic else branch"];
@@ -149,7 +149,7 @@ digraph inPlaceLambdas_kt {
49 [label="Access variable R|<local>/x|"];
50 [label="Function call: R|<local>/x|.R|/A.foo|()"];
51 [label="Access variable R|<local>/x|"];
52 [label="Type operator: x as B"];
52 [label="Type operator: (R|<local>/x| as R|B|)"];
53 [label="Exit function anonymousFunction"];
}
54 [label="Postponed exit from lambda"];
@@ -26,11 +26,11 @@ digraph dataFlowInfoFromWhileCondition_kt {
color=blue
7 [label="Enter ||"];
8 [label="Access variable R|<local>/a|"];
9 [label="Type operator: a is B"];
9 [label="Type operator: (R|<local>/a| is R|B|)"];
10 [label="Exit left part of ||"];
11 [label="Enter right part of ||"];
12 [label="Access variable R|<local>/a|"];
13 [label="Type operator: a is C"];
13 [label="Type operator: (R|<local>/a| is R|C|)"];
14 [label="Exit ||"];
}
15 [label="Exit loop condition"];
@@ -30,7 +30,7 @@ digraph endlessLoops_kt {
color=blue
8 [label="Enter block"];
9 [label="Access variable R|<local>/x|"];
10 [label="Type operator: x as A"];
10 [label="Type operator: (R|<local>/x| as R|A|)"];
subgraph cluster_6 {
color=blue
11 [label="Enter when"];
@@ -125,7 +125,7 @@ digraph endlessLoops_kt {
color=blue
42 [label="Enter block"];
43 [label="Access variable R|<local>/x|"];
44 [label="Type operator: x as A"];
44 [label="Type operator: (R|<local>/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];
@@ -192,7 +192,7 @@ digraph endlessLoops_kt {
color=blue
62 [label="Enter block"];
63 [label="Access variable R|<local>/x|"];
64 [label="Type operator: x as A"];
64 [label="Type operator: (R|<local>/x| as R|A|)"];
subgraph cluster_22 {
color=blue
65 [label="Enter when"];
@@ -321,7 +321,7 @@ digraph endlessLoops_kt {
color=blue
108 [label="Enter block"];
109 [label="Access variable R|<local>/x|"];
110 [label="Type operator: x as A"];
110 [label="Type operator: (R|<local>/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];
@@ -401,7 +401,7 @@ digraph endlessLoops_kt {
color=blue
134 [label="Enter block"];
135 [label="Access variable R|<local>/x|"];
136 [label="Type operator: x as A"];
136 [label="Type operator: (R|<local>/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];
@@ -468,7 +468,7 @@ digraph endlessLoops_kt {
color=blue
154 [label="Enter block"];
155 [label="Access variable R|<local>/x|"];
156 [label="Type operator: x as A"];
156 [label="Type operator: (R|<local>/x| as R|A|)"];
subgraph cluster_48 {
color=blue
157 [label="Enter when"];
@@ -549,7 +549,7 @@ digraph endlessLoops_kt {
color=blue
181 [label="Enter block"];
182 [label="Access variable R|<local>/x|"];
183 [label="Type operator: x as A"];
183 [label="Type operator: (R|<local>/x| as R|A|)"];
184 [label="Exit block"];
}
185 [label="Exit loop block"];
@@ -42,11 +42,11 @@ digraph multipleCasts_kt {
12 [label="Function call: R|/getAny|()"];
13 [label="Variable declaration: lval b: R|kotlin/Any?|"];
14 [label="Access variable R|<local>/a|"];
15 [label="Type operator: a as A"];
15 [label="Type operator: (R|<local>/a| as R|A|)"];
16 [label="Access variable R|<local>/a|"];
17 [label="Function call: R|<local>/a|.R|/A.foo|()"];
18 [label="Access variable R|<local>/b|"];
19 [label="Type operator: b as B"];
19 [label="Type operator: (R|<local>/b| as R|B|)"];
20 [label="Access variable R|<local>/b|"];
21 [label="Function call: R|<local>/b|.R|/B.foo|()"];
22 [label="Exit function test_0" style="filled" fillcolor=red];
@@ -83,11 +83,11 @@ digraph multipleCasts_kt {
color=blue
30 [label="Enter &&"];
31 [label="Access variable R|<local>/a|"];
32 [label="Type operator: a is A"];
32 [label="Type operator: (R|<local>/a| is R|A|)"];
33 [label="Exit left part of &&"];
34 [label="Enter right part of &&"];
35 [label="Access variable R|<local>/b|"];
36 [label="Type operator: b is B"];
36 [label="Type operator: (R|<local>/b| is R|B|)"];
37 [label="Exit &&"];
}
38 [label="Exit when branch condition"];
@@ -13,13 +13,13 @@ digraph implicitReceiverAsWhenSubject_kt {
subgraph cluster_2 {
color=blue
3 [label="Enter when branch condition "];
4 [label="Type operator: List<*>"];
4 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"];
5 [label="Exit when branch condition"];
}
subgraph cluster_3 {
color=blue
6 [label="Enter when branch condition "];
7 [label="Type operator: String"];
7 [label="Type operator: ($subj$ is R|kotlin/String|)"];
8 [label="Exit when branch condition"];
}
subgraph cluster_4 {
@@ -113,13 +113,13 @@ digraph implicitReceiverAsWhenSubject_kt {
subgraph cluster_10 {
color=blue
35 [label="Enter when branch condition "];
36 [label="Type operator: List<*>"];
36 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"];
37 [label="Exit when branch condition"];
}
subgraph cluster_11 {
color=blue
38 [label="Enter when branch condition "];
39 [label="Type operator: String"];
39 [label="Type operator: ($subj$ is R|kotlin/String|)"];
40 [label="Exit when branch condition"];
}
subgraph cluster_12 {
@@ -53,7 +53,7 @@ digraph implicitReceivers_kt {
color=blue
12 [label="Enter when branch condition "];
13 [label="Access variable this@R|/test_1|"];
14 [label="Type operator: this is A"];
14 [label="Type operator: (this@R|/test_1| is R|A|)"];
15 [label="Exit when branch condition"];
}
subgraph cluster_8 {
@@ -126,7 +126,7 @@ digraph implicitReceivers_kt {
color=blue
39 [label="Enter when branch condition "];
40 [label="Access variable this@R|/test_2|"];
41 [label="Type operator: this !is A"];
41 [label="Type operator: (this@R|/test_2| !is R|A|)"];
42 [label="Exit when branch condition"];
}
subgraph cluster_14 {
@@ -208,7 +208,7 @@ digraph implicitReceivers_kt {
color=blue
73 [label="Enter function anonymousFunction"];
74 [label="Access variable this@R|special/anonymous|"];
75 [label="Type operator: this@wb as A"];
75 [label="Type operator: (this@R|special/anonymous| as R|A|)"];
76 [label="Access variable this@R|special/anonymous|"];
77 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"];
78 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"];
@@ -299,7 +299,7 @@ digraph implicitReceivers_kt {
color=blue
94 [label="Enter when branch condition "];
95 [label="Access variable this@R|/test_4|"];
96 [label="Type operator: this !is A"];
96 [label="Type operator: (this@R|/test_4| !is R|A|)"];
97 [label="Exit when branch condition"];
}
subgraph cluster_24 {
@@ -318,7 +318,7 @@ digraph implicitReceivers_kt {
color=blue
103 [label="Enter when branch condition "];
104 [label="Access variable this@R|/test_4|"];
105 [label="Type operator: this !is B"];
105 [label="Type operator: (this@R|/test_4| !is R|B|)"];
106 [label="Exit when branch condition"];
}
subgraph cluster_28 {
@@ -449,14 +449,14 @@ digraph implicitReceivers_kt {
color=blue
152 [label="Enter when branch condition "];
153 [label="Access variable this@R|/test_5|"];
154 [label="Type operator: this is List<*>"];
154 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"];
155 [label="Exit when branch condition"];
}
subgraph cluster_35 {
color=blue
156 [label="Enter when branch condition "];
157 [label="Access variable this@R|/test_5|"];
158 [label="Type operator: this is String"];
158 [label="Type operator: (this@R|/test_5| is R|kotlin/String|)"];
159 [label="Exit when branch condition"];
}
subgraph cluster_36 {
@@ -542,10 +542,10 @@ digraph implicitReceivers_kt {
color=red
181 [label="Enter function test_6" style="filled" fillcolor=red];
182 [label="Access variable this@R|/test_6|"];
183 [label="Type operator: this as List<*>"];
183 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"];
184 [label="Access variable R|kotlin/collections/List.size|"];
185 [label="Access variable this@R|/test_6|"];
186 [label="Type operator: this as String"];
186 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"];
187 [label="Access variable R|kotlin/String.length|"];
188 [label="Exit function test_6" style="filled" fillcolor=red];
}
@@ -26,7 +26,7 @@ digraph thisOfExtensionProperty_kt {
color=blue
5 [label="Enter &&"];
6 [label="Access variable this@R|/check_1|"];
7 [label="Type operator: this is B"];
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|"];
@@ -64,7 +64,7 @@ digraph thisOfExtensionProperty_kt {
color=blue
18 [label="Enter &&"];
19 [label="Access variable this@R|/check_2|"];
20 [label="Type operator: this is B"];
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|"];
@@ -169,7 +169,7 @@ digraph assignSafeCall_kt {
color=blue
57 [label="Enter when"];
58 [label="Access variable R|<local>/x|"];
59 [label="Type operator: x as? A"];
59 [label="Type operator: (R|<local>/x| as? R|A|)"];
60 [label="Variable declaration: lval <elvis>: R|A?|"];
subgraph cluster_15 {
color=blue
@@ -389,7 +389,7 @@ digraph assignSafeCall_kt {
color=blue
136 [label="Enter when"];
137 [label="Access variable R|<local>/x|"];
138 [label="Type operator: x as? B"];
138 [label="Type operator: (R|<local>/x| as? R|B|)"];
139 [label="Variable declaration: lval <elvis>: R|B?|"];
subgraph cluster_33 {
color=blue
@@ -82,7 +82,7 @@ digraph safeCalls_kt {
color=red
25 [label="Enter function test_2" style="filled" fillcolor=red];
26 [label="Access variable R|<local>/x|"];
27 [label="Type operator: x as? A"];
27 [label="Type operator: (R|<local>/x| as? R|A|)"];
28 [label="Enter safe call"];
29 [label="Access variable R|<local>/x|"];
30 [label="Function call: (R|<local>/x| as? R|A|)?.R|/A.bar|(R|<local>/x|)"];
@@ -102,7 +102,7 @@ digraph safeCalls_kt {
color=red
33 [label="Enter function test_3" style="filled" fillcolor=red];
34 [label="Access variable R|<local>/x|"];
35 [label="Type operator: x as? A"];
35 [label="Type operator: (R|<local>/x| as? R|A|)"];
36 [label="Enter safe call"];
37 [label="Access variable R|<local>/x|"];
38 [label="Function call: (R|<local>/x| as? R|A|)?.R|/A.bar|(R|<local>/x|)"];
@@ -49,7 +49,7 @@ digraph overridenOpenVal_kt {
color=blue
12 [label="Enter when branch condition "];
13 [label="Access variable R|/A.x|"];
14 [label="Type operator: x is String"];
14 [label="Type operator: (this@R|/B|.R|/A.x| is R|kotlin/String|)"];
15 [label="Exit when branch condition"];
}
16 [label="Synthetic else branch"];
@@ -93,7 +93,7 @@ digraph overridenOpenVal_kt {
27 [label="Enter when branch condition "];
28 [label="Access variable R|<local>/b|"];
29 [label="Access variable R|/A.x|"];
30 [label="Type operator: b.x is String"];
30 [label="Type operator: (R|<local>/b|.R|/A.x| is R|kotlin/String|)"];
31 [label="Exit when branch condition"];
}
32 [label="Synthetic else branch"];
@@ -7,13 +7,13 @@ digraph conditionalEffects_kt {
color=red
0 [label="Enter function test_1" style="filled" fillcolor=red];
1 [label="Access variable R|<local>/x|"];
2 [label="Type operator: x is Int"];
2 [label="Type operator: (R|<local>/x| is R|kotlin/Int|)"];
3 [label="Function call: R|kotlin/require|((R|<local>/x| is R|kotlin/Int|))"];
subgraph cluster_1 {
color=blue
4 [label="Enter contract"];
5 [label="Access variable R|<local>/x|"];
6 [label="Type operator: x is Int"];
6 [label="Type operator: (R|<local>/x| is R|kotlin/Int|)"];
7 [label="Exit contract"];
}
8 [label="Access variable R|<local>/x|"];
@@ -101,7 +101,7 @@ digraph conditionalEffects_kt {
color=blue
36 [label="Enter &&"];
37 [label="Access variable R|<local>/x|"];
38 [label="Type operator: x is String"];
38 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
39 [label="Exit left part of &&"];
40 [label="Enter right part of &&"];
41 [label="Access variable R|<local>/y|"];
@@ -117,7 +117,7 @@ digraph conditionalEffects_kt {
color=blue
47 [label="Enter &&"];
48 [label="Access variable R|<local>/x|"];
49 [label="Type operator: x is String"];
49 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
50 [label="Exit left part of &&"];
51 [label="Enter right part of &&"];
52 [label="Access variable R|<local>/y|"];
@@ -192,13 +192,13 @@ digraph conditionalEffects_kt {
color=blue
76 [label="Enter block"];
77 [label="Access variable R|<local>/x|"];
78 [label="Type operator: x is String"];
78 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
79 [label="Function call: R|kotlin/require|((R|<local>/x| is R|kotlin/String|))"];
subgraph cluster_16 {
color=blue
80 [label="Enter contract"];
81 [label="Access variable R|<local>/x|"];
82 [label="Type operator: x is String"];
82 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
83 [label="Exit contract"];
}
84 [label="Access variable R|<local>/x|"];
@@ -265,13 +265,13 @@ digraph conditionalEffects_kt {
color=blue
100 [label="Enter block"];
101 [label="Access variable R|<local>/x|"];
102 [label="Type operator: x is String"];
102 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
103 [label="Function call: R|kotlin/require|((R|<local>/x| is R|kotlin/String|))"];
subgraph cluster_22 {
color=blue
104 [label="Enter contract"];
105 [label="Access variable R|<local>/x|"];
106 [label="Type operator: x is String"];
106 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
107 [label="Exit contract"];
}
108 [label="Access variable R|<local>/x|"];
@@ -284,13 +284,13 @@ digraph conditionalEffects_kt {
color=blue
113 [label="Enter block"];
114 [label="Access variable R|<local>/x|"];
115 [label="Type operator: x is String"];
115 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
116 [label="Function call: R|kotlin/require|((R|<local>/x| is R|kotlin/String|))"];
subgraph cluster_24 {
color=blue
117 [label="Enter contract"];
118 [label="Access variable R|<local>/x|"];
119 [label="Type operator: x is String"];
119 [label="Type operator: (R|<local>/x| is R|kotlin/String|)"];
120 [label="Exit contract"];
}
121 [label="Access variable R|<local>/x|"];