diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolver/SingleCandidateResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolver/SingleCandidateResolver.kt index 4acafc25447..c596fab79ca 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolver/SingleCandidateResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolver/SingleCandidateResolver.kt @@ -82,7 +82,7 @@ class SingleCandidateResolver( ?: ResolutionMode.ContextIndependent ) - return completionResult.takeIf { it.callCompleted }?.result + return completionResult } private fun createCandidateInfoProvider(resolutionParameters: ResolutionParameters): CandidateInfoProvider { diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot index de004cd30ce..142ac9814e5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot @@ -286,29 +286,28 @@ digraph flowFromInplaceLambda_kt { color=blue 102 [label="Enter block"]; 103 [label="Access variable R|/x|"]; - 104 [label="Smart cast: R|/x|"]; - 105 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 106 [label="Access variable R|/y|"]; - 107 [label="Smart cast: R|/y|"]; - 108 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 109 [label="Const: Int(1)"]; - 110 [label="Exit block"]; + 104 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 105 [label="Access variable R|/y|"]; + 106 [label="Smart cast: R|/y|"]; + 107 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 108 [label="Const: Int(1)"]; + 109 [label="Exit block"]; } - 111 [label="Exit function " style="filled" fillcolor=red]; + 110 [label="Exit function " style="filled" fillcolor=red]; } - 112 [label="Postponed exit from lambda"]; - 113 [label="Function call: R|/exactlyOnce|(...)" style="filled" fillcolor=yellow]; - 114 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 115 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 116 [label="Access variable R|/x|"]; - 117 [label="Smart cast: R|/x|"]; - 118 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 119 [label="Access variable R|/y|"]; - 120 [label="Smart cast: R|/y|"]; - 121 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 122 [label="Exit block"]; + 111 [label="Postponed exit from lambda"]; + 112 [label="Function call: R|/exactlyOnce|(...)" style="filled" fillcolor=yellow]; + 113 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 114 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 115 [label="Access variable R|/x|"]; + 116 [label="Smart cast: R|/x|"]; + 117 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 118 [label="Access variable R|/y|"]; + 119 [label="Smart cast: R|/y|"]; + 120 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 121 [label="Exit block"]; } - 123 [label="Exit function completedCallExactlyOnce" style="filled" fillcolor=red]; + 122 [label="Exit function completedCallExactlyOnce" style="filled" fillcolor=red]; } 84 -> {85}; 85 -> {86}; @@ -324,13 +323,13 @@ digraph flowFromInplaceLambda_kt { 93 -> {94}; 94 -> {95}; 95 -> {96} [color=green]; - 95 -> {97} [color=red]; + 95 -> {113} [color=red]; 96 -> {97}; 97 -> {98}; 98 -> {99}; 99 -> {100}; - 100 -> {101 113}; - 100 -> {112} [style=dotted]; + 100 -> {101 112}; + 100 -> {111} [style=dotted]; 100 -> {101} [style=dashed]; 101 -> {102}; 102 -> {103}; @@ -342,9 +341,9 @@ digraph flowFromInplaceLambda_kt { 108 -> {109}; 109 -> {110}; 110 -> {111}; - 111 -> {112}; - 112 -> {113} [color=green]; - 112 -> {114} [color=red]; + 111 -> {112} [color=green]; + 111 -> {113} [color=red]; + 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; @@ -354,71 +353,70 @@ digraph flowFromInplaceLambda_kt { 119 -> {120}; 120 -> {121}; 121 -> {122}; - 122 -> {123}; subgraph cluster_30 { color=red - 124 [label="Enter function completedCallAtLeastOnce" style="filled" fillcolor=red]; + 123 [label="Enter function completedCallAtLeastOnce" style="filled" fillcolor=red]; subgraph cluster_31 { color=blue - 125 [label="Enter block"]; - 126 [label="Postponed enter to lambda"]; + 124 [label="Enter block"]; + 125 [label="Postponed enter to lambda"]; subgraph cluster_32 { color=blue - 127 [label="Enter function " style="filled" fillcolor=red]; + 126 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_33 { color=blue - 128 [label="Enter block"]; - 129 [label="Access variable R|/y|"]; - 130 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 131 [label="Access variable R|/x|"]; - 132 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 133 [label="Exit block"]; + 127 [label="Enter block"]; + 128 [label="Access variable R|/y|"]; + 129 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 130 [label="Access variable R|/x|"]; + 131 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 132 [label="Exit block"]; } - 134 [label="Exit function " style="filled" fillcolor=red]; + 133 [label="Exit function " style="filled" fillcolor=red]; } - 135 [label="Postponed exit from lambda"]; - 136 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow]; - 137 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 138 [label="Access variable R|/y|"]; - 139 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 140 [label="Postponed enter to lambda"]; + 134 [label="Postponed exit from lambda"]; + 135 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow]; + 136 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 137 [label="Access variable R|/y|"]; + 138 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 139 [label="Postponed enter to lambda"]; subgraph cluster_34 { color=blue - 141 [label="Enter function " style="filled" fillcolor=red]; + 140 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_35 { color=blue - 142 [label="Enter block"]; - 143 [label="Access variable R|/x|"]; - 144 [label="Smart cast: R|/x|"]; - 145 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 146 [label="Access variable R|/y|"]; - 147 [label="Smart cast: R|/y|"]; - 148 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 149 [label="Const: Int(1)"]; - 150 [label="Exit block"]; + 141 [label="Enter block"]; + 142 [label="Access variable R|/x|"]; + 143 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 144 [label="Access variable R|/y|"]; + 145 [label="Smart cast: R|/y|"]; + 146 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 147 [label="Const: Int(1)"]; + 148 [label="Exit block"]; } - 151 [label="Exit function " style="filled" fillcolor=red]; + 149 [label="Exit function " style="filled" fillcolor=red]; } - 152 [label="Postponed exit from lambda"]; - 153 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow]; - 154 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 155 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 156 [label="Access variable R|/x|"]; - 157 [label="Smart cast: R|/x|"]; - 158 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 159 [label="Access variable R|/y|"]; - 160 [label="Smart cast: R|/y|"]; - 161 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 162 [label="Exit block"]; + 150 [label="Postponed exit from lambda"]; + 151 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow]; + 152 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 153 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 154 [label="Access variable R|/x|"]; + 155 [label="Smart cast: R|/x|"]; + 156 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 157 [label="Access variable R|/y|"]; + 158 [label="Smart cast: R|/y|"]; + 159 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 160 [label="Exit block"]; } - 163 [label="Exit function completedCallAtLeastOnce" style="filled" fillcolor=red]; + 161 [label="Exit function completedCallAtLeastOnce" style="filled" fillcolor=red]; } + 123 -> {124}; 124 -> {125}; - 125 -> {126}; - 126 -> {127 136}; - 126 -> {135} [style=dotted]; - 126 -> {127} [style=dashed]; + 125 -> {126 135}; + 125 -> {134} [style=dotted]; + 125 -> {126} [style=dashed]; + 126 -> {127}; 127 -> {128}; 128 -> {129}; 129 -> {130}; @@ -426,17 +424,17 @@ digraph flowFromInplaceLambda_kt { 131 -> {132}; 132 -> {133}; 133 -> {134}; - 134 -> {135}; - 135 -> {126} [color=green style=dashed]; - 135 -> {136} [color=green]; - 135 -> {137} [color=red]; + 134 -> {125} [color=green style=dashed]; + 134 -> {135} [color=green]; + 134 -> {152} [color=red]; + 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; - 139 -> {140}; - 140 -> {141 153}; - 140 -> {152} [style=dotted]; - 140 -> {141} [style=dashed]; + 139 -> {140 151}; + 139 -> {150} [style=dotted]; + 139 -> {140} [style=dashed]; + 140 -> {141}; 141 -> {142}; 142 -> {143}; 143 -> {144}; @@ -446,11 +444,11 @@ digraph flowFromInplaceLambda_kt { 147 -> {148}; 148 -> {149}; 149 -> {150}; - 150 -> {151}; + 150 -> {139} [color=green style=dashed]; + 150 -> {151} [color=green]; + 150 -> {152} [color=red]; 151 -> {152}; - 152 -> {140} [color=green style=dashed]; - 152 -> {153} [color=green]; - 152 -> {154} [color=red]; + 152 -> {153}; 153 -> {154}; 154 -> {155}; 155 -> {156}; @@ -459,85 +457,85 @@ digraph flowFromInplaceLambda_kt { 158 -> {159}; 159 -> {160}; 160 -> {161}; - 161 -> {162}; - 162 -> {163}; subgraph cluster_36 { color=red - 164 [label="Enter function completedCallAtMostOnce" style="filled" fillcolor=red]; + 162 [label="Enter function completedCallAtMostOnce" style="filled" fillcolor=red]; subgraph cluster_37 { color=blue - 165 [label="Enter block"]; - 166 [label="Postponed enter to lambda"]; + 163 [label="Enter block"]; + 164 [label="Postponed enter to lambda"]; subgraph cluster_38 { color=blue - 167 [label="Enter function " style="filled" fillcolor=red]; + 165 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_39 { color=blue - 168 [label="Enter block"]; - 169 [label="Access variable R|/y|"]; - 170 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 171 [label="Access variable R|/x|"]; - 172 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 173 [label="Exit block"]; + 166 [label="Enter block"]; + 167 [label="Access variable R|/y|"]; + 168 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 169 [label="Access variable R|/x|"]; + 170 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 171 [label="Exit block"]; } - 174 [label="Exit function " style="filled" fillcolor=red]; + 172 [label="Exit function " style="filled" fillcolor=red]; } - 175 [label="Postponed exit from lambda"]; - 176 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow]; - 177 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 178 [label="Access variable R|/y|"]; - 179 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 180 [label="Postponed enter to lambda"]; + 173 [label="Postponed exit from lambda"]; + 174 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow]; + 175 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 176 [label="Access variable R|/y|"]; + 177 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 178 [label="Postponed enter to lambda"]; subgraph cluster_40 { color=blue - 181 [label="Enter function " style="filled" fillcolor=red]; + 179 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_41 { color=blue - 182 [label="Enter block"]; - 183 [label="Access variable R|/x|"]; - 184 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 185 [label="Access variable R|/y|"]; - 186 [label="Smart cast: R|/y|"]; - 187 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 188 [label="Const: Int(1)"]; - 189 [label="Exit block"]; + 180 [label="Enter block"]; + 181 [label="Access variable R|/x|"]; + 182 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 183 [label="Access variable R|/y|"]; + 184 [label="Smart cast: R|/y|"]; + 185 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 186 [label="Const: Int(1)"]; + 187 [label="Exit block"]; } - 190 [label="Exit function " style="filled" fillcolor=red]; + 188 [label="Exit function " style="filled" fillcolor=red]; } - 191 [label="Postponed exit from lambda"]; - 192 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow]; - 193 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 194 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 195 [label="Access variable R|/x|"]; - 196 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 197 [label="Access variable R|/y|"]; - 198 [label="Smart cast: R|/y|"]; - 199 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 200 [label="Exit block"]; + 189 [label="Postponed exit from lambda"]; + 190 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow]; + 191 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 192 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 193 [label="Access variable R|/x|"]; + 194 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 195 [label="Access variable R|/y|"]; + 196 [label="Smart cast: R|/y|"]; + 197 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 198 [label="Exit block"]; } - 201 [label="Exit function completedCallAtMostOnce" style="filled" fillcolor=red]; + 199 [label="Exit function completedCallAtMostOnce" style="filled" fillcolor=red]; } - 164 -> {165}; + 162 -> {163}; + 163 -> {164}; + 164 -> {165 173 174}; + 164 -> {165} [style=dashed]; 165 -> {166}; - 166 -> {167 175 176}; - 166 -> {167} [style=dashed]; + 166 -> {167}; 167 -> {168}; 168 -> {169}; 169 -> {170}; 170 -> {171}; 171 -> {172}; 172 -> {173}; - 173 -> {174}; + 173 -> {174} [color=green]; + 173 -> {191} [color=red]; 174 -> {175}; - 175 -> {176} [color=green]; - 175 -> {177} [color=red]; + 175 -> {176}; 176 -> {177}; 177 -> {178}; - 178 -> {179}; + 178 -> {179 189 190}; + 178 -> {179} [style=dashed]; 179 -> {180}; - 180 -> {181 191 192}; - 180 -> {181} [style=dashed]; + 180 -> {181}; 181 -> {182}; 182 -> {183}; 183 -> {184}; @@ -546,10 +544,10 @@ digraph flowFromInplaceLambda_kt { 186 -> {187}; 187 -> {188}; 188 -> {189}; - 189 -> {190}; + 189 -> {190} [color=green]; + 189 -> {191} [color=red]; 190 -> {191}; - 191 -> {192} [color=green]; - 191 -> {193} [color=red]; + 191 -> {192}; 192 -> {193}; 193 -> {194}; 194 -> {195}; @@ -557,86 +555,86 @@ digraph flowFromInplaceLambda_kt { 196 -> {197}; 197 -> {198}; 198 -> {199}; - 199 -> {200}; - 200 -> {201}; subgraph cluster_42 { color=red - 202 [label="Enter function completedCallUnknown" style="filled" fillcolor=red]; + 200 [label="Enter function completedCallUnknown" style="filled" fillcolor=red]; subgraph cluster_43 { color=blue - 203 [label="Enter block"]; - 204 [label="Postponed enter to lambda"]; + 201 [label="Enter block"]; + 202 [label="Postponed enter to lambda"]; subgraph cluster_44 { color=blue - 205 [label="Enter function " style="filled" fillcolor=red]; + 203 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_45 { color=blue - 206 [label="Enter block"]; - 207 [label="Access variable R|/y|"]; - 208 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 209 [label="Access variable R|/x|"]; - 210 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 211 [label="Exit block"]; + 204 [label="Enter block"]; + 205 [label="Access variable R|/y|"]; + 206 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 207 [label="Access variable R|/x|"]; + 208 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 209 [label="Exit block"]; } - 212 [label="Exit function " style="filled" fillcolor=red]; + 210 [label="Exit function " style="filled" fillcolor=red]; } - 213 [label="Postponed exit from lambda"]; - 214 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow]; - 215 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 216 [label="Access variable R|/y|"]; - 217 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 218 [label="Postponed enter to lambda"]; + 211 [label="Postponed exit from lambda"]; + 212 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow]; + 213 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 214 [label="Access variable R|/y|"]; + 215 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 216 [label="Postponed enter to lambda"]; subgraph cluster_46 { color=blue - 219 [label="Enter function " style="filled" fillcolor=red]; + 217 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_47 { color=blue - 220 [label="Enter block"]; - 221 [label="Access variable R|/x|"]; - 222 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 223 [label="Access variable R|/y|"]; - 224 [label="Smart cast: R|/y|"]; - 225 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 226 [label="Const: Int(1)"]; - 227 [label="Exit block"]; + 218 [label="Enter block"]; + 219 [label="Access variable R|/x|"]; + 220 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 221 [label="Access variable R|/y|"]; + 222 [label="Smart cast: R|/y|"]; + 223 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 224 [label="Const: Int(1)"]; + 225 [label="Exit block"]; } - 228 [label="Exit function " style="filled" fillcolor=red]; + 226 [label="Exit function " style="filled" fillcolor=red]; } - 229 [label="Postponed exit from lambda"]; - 230 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow]; - 231 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 232 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 233 [label="Access variable R|/x|"]; - 234 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 235 [label="Access variable R|/y|"]; - 236 [label="Smart cast: R|/y|"]; - 237 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 238 [label="Exit block"]; + 227 [label="Postponed exit from lambda"]; + 228 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow]; + 229 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 230 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 231 [label="Access variable R|/x|"]; + 232 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 233 [label="Access variable R|/y|"]; + 234 [label="Smart cast: R|/y|"]; + 235 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 236 [label="Exit block"]; } - 239 [label="Exit function completedCallUnknown" style="filled" fillcolor=red]; + 237 [label="Exit function completedCallUnknown" style="filled" fillcolor=red]; } - 202 -> {203}; + 200 -> {201}; + 201 -> {202}; + 202 -> {203 211 212}; + 202 -> {203} [style=dashed]; 203 -> {204}; - 204 -> {205 213 214}; - 204 -> {205} [style=dashed]; + 204 -> {205}; 205 -> {206}; 206 -> {207}; 207 -> {208}; 208 -> {209}; 209 -> {210}; 210 -> {211}; - 211 -> {212}; + 211 -> {202} [color=green style=dashed]; + 211 -> {212} [color=green]; + 211 -> {229} [color=red]; 212 -> {213}; - 213 -> {204} [color=green style=dashed]; - 213 -> {214} [color=green]; - 213 -> {215} [color=red]; + 213 -> {214}; 214 -> {215}; 215 -> {216}; - 216 -> {217}; + 216 -> {217 227 228}; + 216 -> {217} [style=dashed]; 217 -> {218}; - 218 -> {219 229 230}; - 218 -> {219} [style=dashed]; + 218 -> {219}; 219 -> {220}; 220 -> {221}; 221 -> {222}; @@ -645,11 +643,11 @@ digraph flowFromInplaceLambda_kt { 224 -> {225}; 225 -> {226}; 226 -> {227}; - 227 -> {228}; + 227 -> {216} [color=green style=dashed]; + 227 -> {228} [color=green]; + 227 -> {229} [color=red]; 228 -> {229}; - 229 -> {218} [color=green style=dashed]; - 229 -> {230} [color=green]; - 229 -> {231} [color=red]; + 229 -> {230}; 230 -> {231}; 231 -> {232}; 232 -> {233}; @@ -657,84 +655,84 @@ digraph flowFromInplaceLambda_kt { 234 -> {235}; 235 -> {236}; 236 -> {237}; - 237 -> {238}; - 238 -> {239}; subgraph cluster_48 { color=red - 240 [label="Enter function completedCallNoContract" style="filled" fillcolor=red]; + 238 [label="Enter function completedCallNoContract" style="filled" fillcolor=red]; subgraph cluster_49 { color=blue - 241 [label="Enter block"]; - 242 [label="Postponed enter to lambda"]; + 239 [label="Enter block"]; + 240 [label="Postponed enter to lambda"]; subgraph cluster_50 { color=blue - 243 [label="Enter function " style="filled" fillcolor=red]; + 241 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_51 { color=blue - 244 [label="Enter block"]; - 245 [label="Access variable R|/y|"]; - 246 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 247 [label="Access variable R|/x|"]; - 248 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 249 [label="Exit block"]; + 242 [label="Enter block"]; + 243 [label="Access variable R|/y|"]; + 244 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 245 [label="Access variable R|/x|"]; + 246 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 247 [label="Exit block"]; } - 250 [label="Exit function " style="filled" fillcolor=red]; + 248 [label="Exit function " style="filled" fillcolor=red]; } - 251 [label="Postponed exit from lambda"]; - 252 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; - 253 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 254 [label="Access variable R|/y|"]; - 255 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 256 [label="Postponed enter to lambda"]; + 249 [label="Postponed exit from lambda"]; + 250 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; + 251 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 252 [label="Access variable R|/y|"]; + 253 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 254 [label="Postponed enter to lambda"]; subgraph cluster_52 { color=blue - 257 [label="Enter function " style="filled" fillcolor=red]; + 255 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_53 { color=blue - 258 [label="Enter block"]; - 259 [label="Access variable R|/x|"]; - 260 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 261 [label="Access variable R|/y|"]; - 262 [label="Smart cast: R|/y|"]; - 263 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 264 [label="Const: Int(1)"]; - 265 [label="Exit block"]; + 256 [label="Enter block"]; + 257 [label="Access variable R|/x|"]; + 258 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 259 [label="Access variable R|/y|"]; + 260 [label="Smart cast: R|/y|"]; + 261 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 262 [label="Const: Int(1)"]; + 263 [label="Exit block"]; } - 266 [label="Exit function " style="filled" fillcolor=red]; + 264 [label="Exit function " style="filled" fillcolor=red]; } - 267 [label="Postponed exit from lambda"]; - 268 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; - 269 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 270 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 271 [label="Access variable R|/x|"]; - 272 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 273 [label="Access variable R|/y|"]; - 274 [label="Smart cast: R|/y|"]; - 275 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 276 [label="Exit block"]; + 265 [label="Postponed exit from lambda"]; + 266 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; + 267 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 268 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 269 [label="Access variable R|/x|"]; + 270 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 271 [label="Access variable R|/y|"]; + 272 [label="Smart cast: R|/y|"]; + 273 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 274 [label="Exit block"]; } - 277 [label="Exit function completedCallNoContract" style="filled" fillcolor=red]; + 275 [label="Exit function completedCallNoContract" style="filled" fillcolor=red]; } - 240 -> {241}; + 238 -> {239}; + 239 -> {240}; + 240 -> {241 249 250}; + 240 -> {241} [style=dashed]; 241 -> {242}; - 242 -> {243 251 252}; - 242 -> {243} [style=dashed]; + 242 -> {243}; 243 -> {244}; 244 -> {245}; 245 -> {246}; 246 -> {247}; 247 -> {248}; - 248 -> {249}; - 249 -> {250}; - 251 -> {252} [color=green]; - 251 -> {253} [color=red]; + 249 -> {250} [color=green]; + 249 -> {267} [color=red]; + 250 -> {251}; + 251 -> {252}; 252 -> {253}; 253 -> {254}; - 254 -> {255}; + 254 -> {255 265 266}; + 254 -> {255} [style=dashed]; 255 -> {256}; - 256 -> {257 267 268}; - 256 -> {257} [style=dashed]; + 256 -> {257}; 257 -> {258}; 258 -> {259}; 259 -> {260}; @@ -742,10 +740,10 @@ digraph flowFromInplaceLambda_kt { 261 -> {262}; 262 -> {263}; 263 -> {264}; - 264 -> {265}; - 265 -> {266}; - 267 -> {268} [color=green]; - 267 -> {269} [color=red]; + 265 -> {266} [color=green]; + 265 -> {267} [color=red]; + 266 -> {267}; + 267 -> {268}; 268 -> {269}; 269 -> {270}; 270 -> {271}; @@ -753,75 +751,75 @@ digraph flowFromInplaceLambda_kt { 272 -> {273}; 273 -> {274}; 274 -> {275}; - 275 -> {276}; - 276 -> {277}; subgraph cluster_54 { color=red - 278 [label="Enter function incompleteCallExactlyOnce" style="filled" fillcolor=red]; + 276 [label="Enter function incompleteCallExactlyOnce" style="filled" fillcolor=red]; subgraph cluster_55 { color=blue - 279 [label="Enter block"]; - 280 [label="Postponed enter to lambda"]; + 277 [label="Enter block"]; + 278 [label="Postponed enter to lambda"]; subgraph cluster_56 { color=blue - 281 [label="Enter function " style="filled" fillcolor=red]; + 279 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_57 { color=blue - 282 [label="Enter block"]; - 283 [label="Access variable R|/x|"]; - 284 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 285 [label="Access variable R|/y|"]; - 286 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 287 [label="Access variable R|/x|"]; - 288 [label="Smart cast: R|/x|"]; - 289 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 290 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; - 291 [label="Exit block"]; + 280 [label="Enter block"]; + 281 [label="Access variable R|/x|"]; + 282 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 283 [label="Access variable R|/y|"]; + 284 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 285 [label="Access variable R|/x|"]; + 286 [label="Smart cast: R|/x|"]; + 287 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 288 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; + 289 [label="Exit block"]; } - 292 [label="Exit function " style="filled" fillcolor=red]; + 290 [label="Exit function " style="filled" fillcolor=red]; } - 293 [label="Postponed exit from lambda"]; - 294 [label="Function call: R|/exactlyOnce|(...)" style="filled" fillcolor=yellow]; - 295 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 296 [label="Postponed enter to lambda"]; + 291 [label="Postponed exit from lambda"]; + 292 [label="Function call: R|/exactlyOnce|(...)" style="filled" fillcolor=yellow]; + 293 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 294 [label="Postponed enter to lambda"]; subgraph cluster_58 { color=blue - 297 [label="Enter function " style="filled" fillcolor=red]; + 295 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_59 { color=blue - 298 [label="Enter block"]; - 299 [label="Access variable R|/y|"]; - 300 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 301 [label="Access variable R|/x|"]; - 302 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 303 [label="Access variable R|/y|"]; - 304 [label="Smart cast: R|/y|"]; - 305 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 306 [label="Const: Int(1)"]; - 307 [label="Exit block"]; + 296 [label="Enter block"]; + 297 [label="Access variable R|/y|"]; + 298 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 299 [label="Access variable R|/x|"]; + 300 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 301 [label="Access variable R|/y|"]; + 302 [label="Smart cast: R|/y|"]; + 303 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 304 [label="Const: Int(1)"]; + 305 [label="Exit block"]; } - 308 [label="Exit function " style="filled" fillcolor=red]; + 306 [label="Exit function " style="filled" fillcolor=red]; } - 309 [label="Postponed exit from lambda"]; - 310 [label="Function call: R|/exactlyOnce|(...)" style="filled" fillcolor=yellow]; - 311 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 312 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 313 [label="Access variable R|/x|"]; - 314 [label="Smart cast: R|/x|"]; - 315 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 316 [label="Access variable R|/y|"]; - 317 [label="Smart cast: R|/y|"]; - 318 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 319 [label="Exit block"]; + 307 [label="Postponed exit from lambda"]; + 308 [label="Function call: R|/exactlyOnce|(...)" style="filled" fillcolor=yellow]; + 309 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 310 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 311 [label="Access variable R|/x|"]; + 312 [label="Smart cast: R|/x|"]; + 313 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 314 [label="Access variable R|/y|"]; + 315 [label="Smart cast: R|/y|"]; + 316 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 317 [label="Exit block"]; } - 320 [label="Exit function incompleteCallExactlyOnce" style="filled" fillcolor=red]; + 318 [label="Exit function incompleteCallExactlyOnce" style="filled" fillcolor=red]; } - 278 -> {279}; + 276 -> {277}; + 277 -> {278}; + 278 -> {279 292}; + 278 -> {291} [style=dotted]; + 278 -> {279} [style=dashed]; 279 -> {280}; - 280 -> {281 294}; - 280 -> {293} [style=dotted]; - 280 -> {281} [style=dashed]; + 280 -> {281}; 281 -> {282}; 282 -> {283}; 283 -> {284}; @@ -832,15 +830,15 @@ digraph flowFromInplaceLambda_kt { 288 -> {289}; 289 -> {290}; 290 -> {291}; - 291 -> {292}; + 291 -> {292} [color=green]; + 291 -> {309} [color=red]; 292 -> {293}; - 293 -> {294} [color=green]; - 293 -> {311} [color=red]; - 294 -> {295}; + 293 -> {294}; + 294 -> {295 308}; + 294 -> {307} [style=dotted]; + 294 -> {295} [style=dashed]; 295 -> {296}; - 296 -> {297 310}; - 296 -> {309} [style=dotted]; - 296 -> {297} [style=dashed]; + 296 -> {297}; 297 -> {298}; 298 -> {299}; 299 -> {300}; @@ -851,10 +849,10 @@ digraph flowFromInplaceLambda_kt { 304 -> {305}; 305 -> {306}; 306 -> {307}; - 307 -> {308}; + 307 -> {308} [color=green]; + 307 -> {309} [color=red]; 308 -> {309}; - 309 -> {310} [color=green]; - 309 -> {311} [color=red]; + 309 -> {310}; 310 -> {311}; 311 -> {312}; 312 -> {313}; @@ -863,75 +861,75 @@ digraph flowFromInplaceLambda_kt { 315 -> {316}; 316 -> {317}; 317 -> {318}; - 318 -> {319}; - 319 -> {320}; subgraph cluster_60 { color=red - 321 [label="Enter function incompleteCallAtLeastOnce" style="filled" fillcolor=red]; + 319 [label="Enter function incompleteCallAtLeastOnce" style="filled" fillcolor=red]; subgraph cluster_61 { color=blue - 322 [label="Enter block"]; - 323 [label="Postponed enter to lambda"]; + 320 [label="Enter block"]; + 321 [label="Postponed enter to lambda"]; subgraph cluster_62 { color=blue - 324 [label="Enter function " style="filled" fillcolor=red]; + 322 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_63 { color=blue - 325 [label="Enter block"]; - 326 [label="Access variable R|/x|"]; - 327 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 328 [label="Access variable R|/y|"]; - 329 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 330 [label="Access variable R|/x|"]; - 331 [label="Smart cast: R|/x|"]; - 332 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 333 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; - 334 [label="Exit block"]; + 323 [label="Enter block"]; + 324 [label="Access variable R|/x|"]; + 325 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 326 [label="Access variable R|/y|"]; + 327 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 328 [label="Access variable R|/x|"]; + 329 [label="Smart cast: R|/x|"]; + 330 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 331 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; + 332 [label="Exit block"]; } - 335 [label="Exit function " style="filled" fillcolor=red]; + 333 [label="Exit function " style="filled" fillcolor=red]; } - 336 [label="Postponed exit from lambda"]; - 337 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow]; - 338 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 339 [label="Postponed enter to lambda"]; + 334 [label="Postponed exit from lambda"]; + 335 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow]; + 336 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 337 [label="Postponed enter to lambda"]; subgraph cluster_64 { color=blue - 340 [label="Enter function " style="filled" fillcolor=red]; + 338 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_65 { color=blue - 341 [label="Enter block"]; - 342 [label="Access variable R|/y|"]; - 343 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 344 [label="Access variable R|/x|"]; - 345 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 346 [label="Access variable R|/y|"]; - 347 [label="Smart cast: R|/y|"]; - 348 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 349 [label="Const: Int(1)"]; - 350 [label="Exit block"]; + 339 [label="Enter block"]; + 340 [label="Access variable R|/y|"]; + 341 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 342 [label="Access variable R|/x|"]; + 343 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 344 [label="Access variable R|/y|"]; + 345 [label="Smart cast: R|/y|"]; + 346 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 347 [label="Const: Int(1)"]; + 348 [label="Exit block"]; } - 351 [label="Exit function " style="filled" fillcolor=red]; + 349 [label="Exit function " style="filled" fillcolor=red]; } - 352 [label="Postponed exit from lambda"]; - 353 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow]; - 354 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 355 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 356 [label="Access variable R|/x|"]; - 357 [label="Smart cast: R|/x|"]; - 358 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 359 [label="Access variable R|/y|"]; - 360 [label="Smart cast: R|/y|"]; - 361 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 362 [label="Exit block"]; + 350 [label="Postponed exit from lambda"]; + 351 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow]; + 352 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 353 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 354 [label="Access variable R|/x|"]; + 355 [label="Smart cast: R|/x|"]; + 356 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 357 [label="Access variable R|/y|"]; + 358 [label="Smart cast: R|/y|"]; + 359 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 360 [label="Exit block"]; } - 363 [label="Exit function incompleteCallAtLeastOnce" style="filled" fillcolor=red]; + 361 [label="Exit function incompleteCallAtLeastOnce" style="filled" fillcolor=red]; } - 321 -> {322}; + 319 -> {320}; + 320 -> {321}; + 321 -> {322 335}; + 321 -> {334} [style=dotted]; + 321 -> {322} [style=dashed]; 322 -> {323}; - 323 -> {324 337}; - 323 -> {336} [style=dotted]; - 323 -> {324} [style=dashed]; + 323 -> {324}; 324 -> {325}; 325 -> {326}; 326 -> {327}; @@ -942,16 +940,16 @@ digraph flowFromInplaceLambda_kt { 331 -> {332}; 332 -> {333}; 333 -> {334}; - 334 -> {335}; + 334 -> {321} [color=green style=dashed]; + 334 -> {335} [color=green]; + 334 -> {352} [color=red]; 335 -> {336}; - 336 -> {323} [color=green style=dashed]; - 336 -> {337} [color=green]; - 336 -> {354} [color=red]; - 337 -> {338}; + 336 -> {337}; + 337 -> {338 351}; + 337 -> {350} [style=dotted]; + 337 -> {338} [style=dashed]; 338 -> {339}; - 339 -> {340 353}; - 339 -> {352} [style=dotted]; - 339 -> {340} [style=dashed]; + 339 -> {340}; 340 -> {341}; 341 -> {342}; 342 -> {343}; @@ -962,11 +960,11 @@ digraph flowFromInplaceLambda_kt { 347 -> {348}; 348 -> {349}; 349 -> {350}; - 350 -> {351}; + 350 -> {337} [color=green style=dashed]; + 350 -> {351} [color=green]; + 350 -> {352} [color=red]; 351 -> {352}; - 352 -> {339} [color=green style=dashed]; - 352 -> {353} [color=green]; - 352 -> {354} [color=red]; + 352 -> {353}; 353 -> {354}; 354 -> {355}; 355 -> {356}; @@ -975,72 +973,72 @@ digraph flowFromInplaceLambda_kt { 358 -> {359}; 359 -> {360}; 360 -> {361}; - 361 -> {362}; - 362 -> {363}; subgraph cluster_66 { color=red - 364 [label="Enter function incompleteCallAtMostOnce" style="filled" fillcolor=red]; + 362 [label="Enter function incompleteCallAtMostOnce" style="filled" fillcolor=red]; subgraph cluster_67 { color=blue - 365 [label="Enter block"]; - 366 [label="Postponed enter to lambda"]; + 363 [label="Enter block"]; + 364 [label="Postponed enter to lambda"]; subgraph cluster_68 { color=blue - 367 [label="Enter function " style="filled" fillcolor=red]; + 365 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_69 { color=blue - 368 [label="Enter block"]; - 369 [label="Access variable R|/x|"]; - 370 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 371 [label="Access variable R|/y|"]; - 372 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 373 [label="Access variable R|/x|"]; - 374 [label="Smart cast: R|/x|"]; - 375 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 376 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; - 377 [label="Exit block"]; + 366 [label="Enter block"]; + 367 [label="Access variable R|/x|"]; + 368 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 369 [label="Access variable R|/y|"]; + 370 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 371 [label="Access variable R|/x|"]; + 372 [label="Smart cast: R|/x|"]; + 373 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 374 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; + 375 [label="Exit block"]; } - 378 [label="Exit function " style="filled" fillcolor=red]; + 376 [label="Exit function " style="filled" fillcolor=red]; } - 379 [label="Postponed exit from lambda"]; - 380 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow]; - 381 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 382 [label="Postponed enter to lambda"]; + 377 [label="Postponed exit from lambda"]; + 378 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow]; + 379 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 380 [label="Postponed enter to lambda"]; subgraph cluster_70 { color=blue - 383 [label="Enter function " style="filled" fillcolor=red]; + 381 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_71 { color=blue - 384 [label="Enter block"]; - 385 [label="Access variable R|/y|"]; - 386 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 387 [label="Access variable R|/x|"]; - 388 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 389 [label="Access variable R|/y|"]; - 390 [label="Smart cast: R|/y|"]; - 391 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 392 [label="Const: Int(1)"]; - 393 [label="Exit block"]; + 382 [label="Enter block"]; + 383 [label="Access variable R|/y|"]; + 384 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 385 [label="Access variable R|/x|"]; + 386 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 387 [label="Access variable R|/y|"]; + 388 [label="Smart cast: R|/y|"]; + 389 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 390 [label="Const: Int(1)"]; + 391 [label="Exit block"]; } - 394 [label="Exit function " style="filled" fillcolor=red]; + 392 [label="Exit function " style="filled" fillcolor=red]; } - 395 [label="Postponed exit from lambda"]; - 396 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow]; - 397 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 398 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 399 [label="Access variable R|/x|"]; - 400 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 401 [label="Access variable R|/y|"]; - 402 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 403 [label="Exit block"]; + 393 [label="Postponed exit from lambda"]; + 394 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow]; + 395 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 396 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 397 [label="Access variable R|/x|"]; + 398 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 399 [label="Access variable R|/y|"]; + 400 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 401 [label="Exit block"]; } - 404 [label="Exit function incompleteCallAtMostOnce" style="filled" fillcolor=red]; + 402 [label="Exit function incompleteCallAtMostOnce" style="filled" fillcolor=red]; } - 364 -> {365}; + 362 -> {363}; + 363 -> {364}; + 364 -> {365 377 378}; + 364 -> {365} [style=dashed]; 365 -> {366}; - 366 -> {367 379 380}; - 366 -> {367} [style=dashed]; + 366 -> {367}; 367 -> {368}; 368 -> {369}; 369 -> {370}; @@ -1051,14 +1049,14 @@ digraph flowFromInplaceLambda_kt { 374 -> {375}; 375 -> {376}; 376 -> {377}; - 377 -> {378}; + 377 -> {378} [color=green]; + 377 -> {395} [color=red]; 378 -> {379}; - 379 -> {380} [color=green]; - 379 -> {397} [color=red]; - 380 -> {381}; + 379 -> {380}; + 380 -> {381 393 394}; + 380 -> {381} [style=dashed]; 381 -> {382}; - 382 -> {383 395 396}; - 382 -> {383} [style=dashed]; + 382 -> {383}; 383 -> {384}; 384 -> {385}; 385 -> {386}; @@ -1069,82 +1067,82 @@ digraph flowFromInplaceLambda_kt { 390 -> {391}; 391 -> {392}; 392 -> {393}; - 393 -> {394}; + 393 -> {394} [color=green]; + 393 -> {395} [color=red]; 394 -> {395}; - 395 -> {396} [color=green]; - 395 -> {397} [color=red]; + 395 -> {396}; 396 -> {397}; 397 -> {398}; 398 -> {399}; 399 -> {400}; 400 -> {401}; 401 -> {402}; - 402 -> {403}; - 403 -> {404}; subgraph cluster_72 { color=red - 405 [label="Enter function incompleteCallUnknown" style="filled" fillcolor=red]; + 403 [label="Enter function incompleteCallUnknown" style="filled" fillcolor=red]; subgraph cluster_73 { color=blue - 406 [label="Enter block"]; - 407 [label="Postponed enter to lambda"]; + 404 [label="Enter block"]; + 405 [label="Postponed enter to lambda"]; subgraph cluster_74 { color=blue - 408 [label="Enter function " style="filled" fillcolor=red]; + 406 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_75 { color=blue - 409 [label="Enter block"]; - 410 [label="Access variable R|/x|"]; - 411 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 412 [label="Access variable R|/y|"]; - 413 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 414 [label="Access variable R|/x|"]; - 415 [label="Smart cast: R|/x|"]; - 416 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 417 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; - 418 [label="Exit block"]; + 407 [label="Enter block"]; + 408 [label="Access variable R|/x|"]; + 409 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 410 [label="Access variable R|/y|"]; + 411 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 412 [label="Access variable R|/x|"]; + 413 [label="Smart cast: R|/x|"]; + 414 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 415 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; + 416 [label="Exit block"]; } - 419 [label="Exit function " style="filled" fillcolor=red]; + 417 [label="Exit function " style="filled" fillcolor=red]; } - 420 [label="Postponed exit from lambda"]; - 421 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow]; - 422 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 423 [label="Postponed enter to lambda"]; + 418 [label="Postponed exit from lambda"]; + 419 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow]; + 420 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 421 [label="Postponed enter to lambda"]; subgraph cluster_76 { color=blue - 424 [label="Enter function " style="filled" fillcolor=red]; + 422 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_77 { color=blue - 425 [label="Enter block"]; - 426 [label="Access variable R|/y|"]; - 427 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 428 [label="Access variable R|/x|"]; - 429 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 430 [label="Access variable R|/y|"]; - 431 [label="Smart cast: R|/y|"]; - 432 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 433 [label="Const: Int(1)"]; - 434 [label="Exit block"]; + 423 [label="Enter block"]; + 424 [label="Access variable R|/y|"]; + 425 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 426 [label="Access variable R|/x|"]; + 427 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 428 [label="Access variable R|/y|"]; + 429 [label="Smart cast: R|/y|"]; + 430 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 431 [label="Const: Int(1)"]; + 432 [label="Exit block"]; } - 435 [label="Exit function " style="filled" fillcolor=red]; + 433 [label="Exit function " style="filled" fillcolor=red]; } - 436 [label="Postponed exit from lambda"]; - 437 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow]; - 438 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 439 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 440 [label="Access variable R|/x|"]; - 441 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 442 [label="Access variable R|/y|"]; - 443 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 444 [label="Exit block"]; + 434 [label="Postponed exit from lambda"]; + 435 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow]; + 436 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 437 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 438 [label="Access variable R|/x|"]; + 439 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 440 [label="Access variable R|/y|"]; + 441 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 442 [label="Exit block"]; } - 445 [label="Exit function incompleteCallUnknown" style="filled" fillcolor=red]; + 443 [label="Exit function incompleteCallUnknown" style="filled" fillcolor=red]; } - 405 -> {406}; + 403 -> {404}; + 404 -> {405}; + 405 -> {406 418 419}; + 405 -> {406} [style=dashed]; 406 -> {407}; - 407 -> {408 420 421}; - 407 -> {408} [style=dashed]; + 407 -> {408}; 408 -> {409}; 409 -> {410}; 410 -> {411}; @@ -1155,15 +1153,15 @@ digraph flowFromInplaceLambda_kt { 415 -> {416}; 416 -> {417}; 417 -> {418}; - 418 -> {419}; + 418 -> {405} [color=green style=dashed]; + 418 -> {419} [color=green]; + 418 -> {436} [color=red]; 419 -> {420}; - 420 -> {407} [color=green style=dashed]; - 420 -> {421} [color=green]; - 420 -> {438} [color=red]; - 421 -> {422}; + 420 -> {421}; + 421 -> {422 434 435}; + 421 -> {422} [style=dashed]; 422 -> {423}; - 423 -> {424 436 437}; - 423 -> {424} [style=dashed]; + 423 -> {424}; 424 -> {425}; 425 -> {426}; 426 -> {427}; @@ -1174,83 +1172,83 @@ digraph flowFromInplaceLambda_kt { 431 -> {432}; 432 -> {433}; 433 -> {434}; - 434 -> {435}; + 434 -> {421} [color=green style=dashed]; + 434 -> {435} [color=green]; + 434 -> {436} [color=red]; 435 -> {436}; - 436 -> {423} [color=green style=dashed]; - 436 -> {437} [color=green]; - 436 -> {438} [color=red]; + 436 -> {437}; 437 -> {438}; 438 -> {439}; 439 -> {440}; 440 -> {441}; 441 -> {442}; 442 -> {443}; - 443 -> {444}; - 444 -> {445}; subgraph cluster_78 { color=red - 446 [label="Enter function incompleteCallNoContract" style="filled" fillcolor=red]; + 444 [label="Enter function incompleteCallNoContract" style="filled" fillcolor=red]; subgraph cluster_79 { color=blue - 447 [label="Enter block"]; - 448 [label="Postponed enter to lambda"]; + 445 [label="Enter block"]; + 446 [label="Postponed enter to lambda"]; subgraph cluster_80 { color=blue - 449 [label="Enter function " style="filled" fillcolor=red]; + 447 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_81 { color=blue - 450 [label="Enter block"]; - 451 [label="Access variable R|/x|"]; - 452 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 453 [label="Access variable R|/y|"]; - 454 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 455 [label="Access variable R|/x|"]; - 456 [label="Smart cast: R|/x|"]; - 457 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 458 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; - 459 [label="Exit block"]; + 448 [label="Enter block"]; + 449 [label="Access variable R|/x|"]; + 450 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 451 [label="Access variable R|/y|"]; + 452 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 453 [label="Access variable R|/x|"]; + 454 [label="Smart cast: R|/x|"]; + 455 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 456 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; + 457 [label="Exit block"]; } - 460 [label="Exit function " style="filled" fillcolor=red]; + 458 [label="Exit function " style="filled" fillcolor=red]; } - 461 [label="Postponed exit from lambda"]; - 462 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; - 463 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 464 [label="Postponed enter to lambda"]; + 459 [label="Postponed exit from lambda"]; + 460 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; + 461 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 462 [label="Postponed enter to lambda"]; subgraph cluster_82 { color=blue - 465 [label="Enter function " style="filled" fillcolor=red]; + 463 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_83 { color=blue - 466 [label="Enter block"]; - 467 [label="Access variable R|/y|"]; - 468 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 469 [label="Access variable R|/x|"]; - 470 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 471 [label="Access variable R|/y|"]; - 472 [label="Smart cast: R|/y|"]; - 473 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 474 [label="Const: Int(1)"]; - 475 [label="Exit block"]; + 464 [label="Enter block"]; + 465 [label="Access variable R|/y|"]; + 466 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 467 [label="Access variable R|/x|"]; + 468 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 469 [label="Access variable R|/y|"]; + 470 [label="Smart cast: R|/y|"]; + 471 [label="Function call: R|/y|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 472 [label="Const: Int(1)"]; + 473 [label="Exit block"]; } - 476 [label="Exit function " style="filled" fillcolor=red]; + 474 [label="Exit function " style="filled" fillcolor=red]; } - 477 [label="Postponed exit from lambda"]; - 478 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; - 479 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 480 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 481 [label="Access variable R|/x|"]; - 482 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; - 483 [label="Access variable R|/y|"]; - 484 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; - 485 [label="Exit block"]; + 475 [label="Postponed exit from lambda"]; + 476 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; + 477 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 478 [label="Function call: R|/select|(...).R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 479 [label="Access variable R|/x|"]; + 480 [label="Function call: R|/x|.#()" style="filled" fillcolor=yellow]; + 481 [label="Access variable R|/y|"]; + 482 [label="Function call: R|/y|.#()" style="filled" fillcolor=yellow]; + 483 [label="Exit block"]; } - 486 [label="Exit function incompleteCallNoContract" style="filled" fillcolor=red]; + 484 [label="Exit function incompleteCallNoContract" style="filled" fillcolor=red]; } - 446 -> {447}; + 444 -> {445}; + 445 -> {446}; + 446 -> {447 459 460}; + 446 -> {447} [style=dashed]; 447 -> {448}; - 448 -> {449 461 462}; - 448 -> {449} [style=dashed]; + 448 -> {449}; 449 -> {450}; 450 -> {451}; 451 -> {452}; @@ -1260,14 +1258,14 @@ digraph flowFromInplaceLambda_kt { 455 -> {456}; 456 -> {457}; 457 -> {458}; - 458 -> {459}; - 459 -> {460}; - 461 -> {462} [color=green]; - 461 -> {479} [color=red]; - 462 -> {463}; + 459 -> {460} [color=green]; + 459 -> {477} [color=red]; + 460 -> {461}; + 461 -> {462}; + 462 -> {463 475 476}; + 462 -> {463} [style=dashed]; 463 -> {464}; - 464 -> {465 477 478}; - 464 -> {465} [style=dashed]; + 464 -> {465}; 465 -> {466}; 466 -> {467}; 467 -> {468}; @@ -1277,157 +1275,155 @@ digraph flowFromInplaceLambda_kt { 471 -> {472}; 472 -> {473}; 473 -> {474}; - 474 -> {475}; - 475 -> {476}; - 477 -> {478} [color=green]; - 477 -> {479} [color=red]; + 475 -> {476} [color=green]; + 475 -> {477} [color=red]; + 476 -> {477}; + 477 -> {478}; 478 -> {479}; 479 -> {480}; 480 -> {481}; 481 -> {482}; 482 -> {483}; 483 -> {484}; - 484 -> {485}; - 485 -> {486}; subgraph cluster_84 { color=red - 487 [label="Enter function expectedType" style="filled" fillcolor=red]; + 485 [label="Enter function expectedType" style="filled" fillcolor=red]; subgraph cluster_85 { color=blue - 488 [label="Enter block"]; - 489 [label="Postponed enter to lambda"]; + 486 [label="Enter block"]; + 487 [label="Postponed enter to lambda"]; subgraph cluster_86 { color=blue - 490 [label="Enter function " style="filled" fillcolor=red]; + 488 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_87 { color=blue - 491 [label="Enter block"]; - 492 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; - 493 [label="Exit block"]; + 489 [label="Enter block"]; + 490 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; + 491 [label="Exit block"]; } - 494 [label="Exit function " style="filled" fillcolor=red]; + 492 [label="Exit function " style="filled" fillcolor=red]; } - 495 [label="Postponed exit from lambda"]; - 496 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=yellow]; - 497 [label="Postponed enter to lambda"]; + 493 [label="Postponed exit from lambda"]; + 494 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=yellow]; + 495 [label="Postponed enter to lambda"]; subgraph cluster_88 { color=blue - 498 [label="Enter function " style="filled" fillcolor=red]; + 496 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_89 { color=blue - 499 [label="Enter block"]; - 500 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; - 501 [label="Exit block"]; + 497 [label="Enter block"]; + 498 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; + 499 [label="Exit block"]; } - 502 [label="Exit function " style="filled" fillcolor=red]; + 500 [label="Exit function " style="filled" fillcolor=red]; } - 503 [label="Postponed exit from lambda"]; - 504 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=yellow]; - 505 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; - 506 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 507 [label="Access variable R|/x|"]; - 508 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 509 [label="Exit block"]; + 501 [label="Postponed exit from lambda"]; + 502 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=yellow]; + 503 [label="Function call: R|/select|(...)" style="filled" fillcolor=yellow]; + 504 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 505 [label="Access variable R|/x|"]; + 506 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 507 [label="Exit block"]; } - 510 [label="Exit function expectedType" style="filled" fillcolor=red]; + 508 [label="Exit function expectedType" style="filled" fillcolor=red]; } - 487 -> {488}; + 485 -> {486}; + 486 -> {487}; + 487 -> {488 494}; + 487 -> {493} [style=dotted]; + 487 -> {488} [style=dashed]; 488 -> {489}; - 489 -> {490 496}; - 489 -> {495} [style=dotted]; - 489 -> {490} [style=dashed]; + 489 -> {490}; 490 -> {491}; 491 -> {492}; 492 -> {493}; - 493 -> {494}; + 493 -> {494} [color=green]; + 493 -> {503} [color=red]; 494 -> {495}; - 495 -> {496} [color=green]; - 495 -> {505} [color=red]; + 495 -> {496 502}; + 495 -> {501} [style=dotted]; + 495 -> {496} [style=dashed]; 496 -> {497}; - 497 -> {498 504}; - 497 -> {503} [style=dotted]; - 497 -> {498} [style=dashed]; + 497 -> {498}; 498 -> {499}; 499 -> {500}; 500 -> {501}; - 501 -> {502}; + 501 -> {502} [color=green]; + 501 -> {503} [color=red]; 502 -> {503}; - 503 -> {504} [color=green]; - 503 -> {505} [color=red]; + 503 -> {504}; 504 -> {505}; 505 -> {506}; 506 -> {507}; 507 -> {508}; - 508 -> {509}; - 509 -> {510}; subgraph cluster_90 { color=red - 511 [label="Enter function expectedTypeNested" style="filled" fillcolor=red]; + 509 [label="Enter function expectedTypeNested" style="filled" fillcolor=red]; subgraph cluster_91 { color=blue - 512 [label="Enter block"]; - 513 [label="Postponed enter to lambda"]; + 510 [label="Enter block"]; + 511 [label="Postponed enter to lambda"]; subgraph cluster_92 { color=blue - 514 [label="Enter function " style="filled" fillcolor=red]; + 512 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_93 { color=blue - 515 [label="Enter block"]; - 516 [label="Postponed enter to lambda"]; + 513 [label="Enter block"]; + 514 [label="Postponed enter to lambda"]; subgraph cluster_94 { color=blue - 517 [label="Enter function " style="filled" fillcolor=red]; + 515 [label="Enter function " style="filled" fillcolor=red]; subgraph cluster_95 { color=blue - 518 [label="Enter block"]; - 519 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; - 520 [label="Exit block"]; + 516 [label="Enter block"]; + 517 [label="Function call: R|/materialize|()" style="filled" fillcolor=yellow]; + 518 [label="Exit block"]; } - 521 [label="Exit function " style="filled" fillcolor=red]; + 519 [label="Exit function " style="filled" fillcolor=red]; } - 522 [label="Postponed exit from lambda"]; - 523 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=yellow]; - 524 [label="Exit block"]; + 520 [label="Postponed exit from lambda"]; + 521 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=yellow]; + 522 [label="Exit block"]; } - 525 [label="Exit function " style="filled" fillcolor=red]; + 523 [label="Exit function " style="filled" fillcolor=red]; } - 526 [label="Postponed exit from lambda"]; - 527 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; - 528 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; - 529 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 530 [label="Access variable R|/x|"]; - 531 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; - 532 [label="Exit block"]; + 524 [label="Postponed exit from lambda"]; + 525 [label="Function call: R|/noContract|(...)" style="filled" fillcolor=yellow]; + 526 [label="Function call: R|/id|(...)" style="filled" fillcolor=yellow]; + 527 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 528 [label="Access variable R|/x|"]; + 529 [label="Function call: R|/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow]; + 530 [label="Exit block"]; } - 533 [label="Exit function expectedTypeNested" style="filled" fillcolor=red]; + 531 [label="Exit function expectedTypeNested" style="filled" fillcolor=red]; } - 511 -> {512}; + 509 -> {510}; + 510 -> {511}; + 511 -> {512 524 525}; + 511 -> {512} [style=dashed]; 512 -> {513}; - 513 -> {514 526 527}; - 513 -> {514} [style=dashed]; - 514 -> {515}; + 513 -> {514}; + 514 -> {515 521}; + 514 -> {520} [style=dotted]; + 514 -> {515} [style=dashed]; 515 -> {516}; - 516 -> {517 523}; - 516 -> {522} [style=dotted]; - 516 -> {517} [style=dashed]; + 516 -> {517}; 517 -> {518}; 518 -> {519}; 519 -> {520}; - 520 -> {521}; + 520 -> {521} [color=green]; + 520 -> {526} [color=red]; 521 -> {522}; - 522 -> {523} [color=green]; - 522 -> {528} [color=red]; - 523 -> {524}; - 524 -> {525}; - 526 -> {527} [color=green]; - 526 -> {528} [color=red]; + 522 -> {523}; + 524 -> {525} [color=green]; + 524 -> {526} [color=red]; + 525 -> {526}; + 526 -> {527}; 527 -> {528}; 528 -> {529}; 529 -> {530}; 530 -> {531}; - 531 -> {532}; - 532 -> {533}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.fir.txt b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.fir.txt index 42cebb41d84..11206efe03f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.fir.txt @@ -84,7 +84,7 @@ FILE: flowFromInplaceLambda.kt ^ (R|/x| as R|kotlin/Int|) } )), (R|/y| as R|kotlin/Int|), R|/exactlyOnce|( = exactlyOnce@fun (): R|kotlin/Int| { - R|/x|.R|kotlin/Int.inc|() + R|/x|.#() R|/y|.R|kotlin/Int.inc|() ^ Int(1) } @@ -98,7 +98,7 @@ FILE: flowFromInplaceLambda.kt ^ (R|/x| as R|kotlin/Int|) } )), (R|/y| as R|kotlin/Int|), R|/atLeastOnce|( = atLeastOnce@fun (): R|kotlin/Int| { - R|/x|.R|kotlin/Int.inc|() + R|/x|.#() R|/y|.R|kotlin/Int.inc|() ^ Int(1) } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.kt b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.kt index 8efba38ce7a..4e17a8cb0d7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.kt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.kt @@ -39,7 +39,7 @@ fun completedCallExactlyOnce(x: Any?, y: Any?) { // The value of the type argument is known, so the call is complete and the data can flow. id(exactlyOnce { y.inc(); x as Int }), y as Int, - exactlyOnce { x.inc(); y.inc(); 1 } + exactlyOnce { x.inc(); y.inc(); 1 } ).inc() // OK x.inc() // OK y.inc() // OK @@ -49,7 +49,7 @@ fun completedCallAtLeastOnce(x: Any?, y: Any?) { select( id(atLeastOnce { y.inc(); x as Int }), y as Int, - atLeastOnce { x.inc(); y.inc(); 1 } + atLeastOnce { x.inc(); y.inc(); 1 } ).inc() // OK x.inc() // OK y.inc() // OK diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot index 841e247c6e6..c8be04c098b 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot @@ -112,8 +112,9 @@ finally { 20 -> {21}; 21 -> {22}; 22 -> {23}; - 23 -> {24}; 23 -> {17} [color=green style=dashed]; + 23 -> {24} [color=green]; + 23 -> {31} [color=red]; 24 -> {25}; 24 -> {27} [label="onUncaughtException"]; 25 -> {26}; @@ -201,7 +202,8 @@ finally { 44 -> {45}; 45 -> {46}; 46 -> {47}; - 48 -> {49}; + 48 -> {49} [color=green]; + 48 -> {56} [color=red]; 49 -> {50}; 49 -> {52} [label="onUncaughtException"]; 50 -> {51}; diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt index 4a70cd84f90..10eae0d1b66 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt @@ -323,7 +323,7 @@ private fun BodyResolveComponents.createExplicitReceiverForInvokeByCallable( } source = info.fakeSourceForImplicitInvokeCallReceiver }.build().let { - callCompleter.completeCall(it, ResolutionMode.ReceiverResolution).result + callCompleter.completeCall(it, ResolutionMode.ReceiverResolution) }.let { transformQualifiedAccessUsingSmartcastInfo(it) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index 783d37fc936..40817875fe2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -54,13 +54,10 @@ class FirCallCompleter( val completer = ConstraintSystemCompleter(components, transformer.context) - - data class CompletionResult(val result: T, val callCompleted: Boolean) - - fun completeCall(call: T, resolutionMode: ResolutionMode): CompletionResult where T : FirResolvable, T : FirStatement { + fun completeCall(call: T, resolutionMode: ResolutionMode): T where T : FirResolvable, T : FirStatement { val typeRef = components.typeFromCallee(call) - val reference = call.calleeReference as? FirNamedReferenceWithCandidate ?: return CompletionResult(call, true) + val reference = call.calleeReference as? FirNamedReferenceWithCandidate ?: return call val candidate = reference.candidate val initialType = typeRef.initialTypeOfCandidate(candidate) @@ -104,10 +101,10 @@ class FirCallCompleter( null ) inferenceSession.addCompletedCall(completedCall, candidate) - CompletionResult(completedCall, true) + completedCall } else { inferenceSession.addPartiallyResolvedCall(call) - CompletionResult(call, false) + call } } @@ -120,7 +117,7 @@ class FirCallCompleter( inferenceSession.addPartiallyResolvedCall(call) } - CompletionResult(call, false) + call } ConstraintSystemCompletionMode.UNTIL_FIRST_LAMBDA -> throw IllegalStateException() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt index 760394d8d42..2a79890cc19 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt @@ -188,7 +188,7 @@ class FirSyntheticCallGenerator( this.argumentList = argumentList } - val result = components.callCompleter.completeCall(fakeCallElement, ResolutionMode.ContextIndependent).result + val result = components.callCompleter.completeCall(fakeCallElement, ResolutionMode.ContextIndependent) val completedCallableReference = result.argument as FirCallableReferenceAccess? val callCalleeReference = result.calleeReference diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirArrayOfCallTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirArrayOfCallTransformer.kt index 03f9152d9ac..2555cf54b9c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirArrayOfCallTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirArrayOfCallTransformer.kt @@ -25,9 +25,8 @@ import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer */ class FirArrayOfCallTransformer : FirDefaultTransformer() { private fun toArrayOfCall(functionCall: FirFunctionCall): FirArrayOfCall? { - if (!functionCall.isArrayOfCall) { - return null - } + if (!functionCall.isArrayOfCall) return null + if (functionCall.calleeReference !is FirResolvedNamedReference) return null return buildArrayOfCall { source = functionCall.source annotations += functionCall.annotations diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt index fd37b68cfc8..4d46f007e5a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirControlFlowStatementsResolveTransformer.kt @@ -94,24 +94,18 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirAbstractBodyRes // exhaustiveness is not yet computed there, but at the same time to compute it properly // we need having branches condition bes analyzed that is why we can't have call // `whenExpression.transformSingle(whenExhaustivenessTransformer, null)` at the beginning - val callCompleted = when { - completionNeeded -> { - val completionResult = callCompleter.completeCall( - whenExpression, - // For non-exhaustive when expressions, we should complete then as independent because below - // their type is artificially replaced with Unit, while candidate symbol's return type remains the same - // So when combining two when's the inner one was erroneously resolved as a normal dependent exhaustive sub-expression - // At the same time, it all looks suspicious and inconsistent, so we hope it would be investigated at KT-55175 - if (whenExpression.isProperlyExhaustive) data else ResolutionMode.ContextIndependent, - ) - whenExpression = completionResult.result - - completionResult.callCompleted - } - else -> false + if (completionNeeded) { + val completionResult = callCompleter.completeCall( + whenExpression, + // For non-exhaustive when expressions, we should complete then as independent because below + // their type is artificially replaced with Unit, while candidate symbol's return type remains the same + // So when combining two when's the inner one was erroneously resolved as a normal dependent exhaustive sub-expression + // At the same time, it all looks suspicious and inconsistent, so we hope it would be investigated at KT-55175 + if (whenExpression.isProperlyExhaustive) data else ResolutionMode.ContextIndependent, + ) + whenExpression = completionResult } - - dataFlowAnalyzer.exitWhenExpression(whenExpression, callCompleted) + dataFlowAnalyzer.exitWhenExpression(whenExpression, data.forceFullCompletion) whenExpression = whenExpression.replaceReturnTypeIfNotExhaustive() whenExpression } @@ -169,13 +163,13 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirAbstractBodyRes tryExpression.transformCatches(this, ResolutionMode.ContextDependent) val incomplete = syntheticCallGenerator.generateCalleeForTryExpression(tryExpression, resolutionContext) - var (result, callCompleted) = callCompleter.completeCall(incomplete, data) + var result = callCompleter.completeCall(incomplete, data) if (result.finallyBlock != null) { dataFlowAnalyzer.enterFinallyBlock() result = result.transformFinallyBlock(transformer, ResolutionMode.ContextIndependent) dataFlowAnalyzer.exitFinallyBlock() } - dataFlowAnalyzer.exitTryExpression(callCompleted) + dataFlowAnalyzer.exitTryExpression(data.forceFullCompletion) return result } @@ -262,7 +256,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirAbstractBodyRes ) elvisExpression.transformRhs(transformer, resolutionModeForRhs) - val (result, callCompleted) = callCompleter.completeCall( + val result = callCompleter.completeCall( syntheticCallGenerator.generateCalleeForElvisExpression(elvisExpression, resolutionContext), data ) @@ -291,7 +285,7 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirAbstractBodyRes } } - dataFlowAnalyzer.exitElvis(elvisExpression, isLhsNotNull, callCompleted) + dataFlowAnalyzer.exitElvis(elvisExpression, isLhsNotNull, data.forceFullCompletion) return result } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 3a065fce366..71d6b851bb0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -166,7 +166,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT if (!transformedCallee.isAcceptableResolvedQualifiedAccess()) { return qualifiedAccessExpression } - callCompleter.completeCall(transformedCallee, data).result + callCompleter.completeCall(transformedCallee, data) } else { transformedCallee } @@ -419,44 +419,39 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT functionCall.transformAnnotations(transformer, data) functionCall.replaceLambdaArgumentInvocationKinds(session) functionCall.transformTypeArguments(transformer, ResolutionMode.ContextIndependent) - val (completeInference, callCompleted) = - run { - val initialExplicitReceiver = functionCall.explicitReceiver - val withTransformedArguments = if (!resolvingAugmentedAssignment) { - dataFlowAnalyzer.enterCallArguments(functionCall, functionCall.arguments) - // In provideDelegate mode the explicitReceiver is already resolved - // E.g. we have val some by someDelegate - // At 1st stage of delegate inference we resolve someDelegate itself, - // at 2nd stage in provideDelegate mode we are trying to resolve someDelegate.provideDelegate(), - // and 'someDelegate' explicit receiver is resolved at 1st stage - // See also FirDeclarationsResolveTransformer.transformWrappedDelegateExpression - val withResolvedExplicitReceiver = if (provideDelegate) functionCall else transformExplicitReceiver(functionCall) - withResolvedExplicitReceiver.also { - it.replaceArgumentList(it.argumentList.transform(this, ResolutionMode.ContextDependent)) - dataFlowAnalyzer.exitCallArguments() - } - } else { - functionCall - } - val resultExpression = callResolver.resolveCallAndSelectCandidate(withTransformedArguments) - val resultExplicitReceiver = resultExpression.explicitReceiver?.unwrapSmartcastExpression() - if (initialExplicitReceiver !== resultExplicitReceiver && resultExplicitReceiver is FirQualifiedAccessExpression) { - // name.invoke() case - callCompleter.completeCall(resultExplicitReceiver, ResolutionMode.ContextIndependent) - } - callCompleter.completeCall(resultExpression, data) + val initialExplicitReceiver = functionCall.explicitReceiver + val withTransformedArguments = if (!resolvingAugmentedAssignment) { + dataFlowAnalyzer.enterCallArguments(functionCall, functionCall.arguments) + // In provideDelegate mode the explicitReceiver is already resolved + // E.g. we have val some by someDelegate + // At 1st stage of delegate inference we resolve someDelegate itself, + // at 2nd stage in provideDelegate mode we are trying to resolve someDelegate.provideDelegate(), + // and 'someDelegate' explicit receiver is resolved at 1st stage + // See also FirDeclarationsResolveTransformer.transformWrappedDelegateExpression + val withResolvedExplicitReceiver = if (provideDelegate) functionCall else transformExplicitReceiver(functionCall) + withResolvedExplicitReceiver.also { + it.replaceArgumentList(it.argumentList.transform(this, ResolutionMode.ContextDependent)) + dataFlowAnalyzer.exitCallArguments() } + } else { + functionCall + } + val resultExpression = callResolver.resolveCallAndSelectCandidate(withTransformedArguments) + val resultExplicitReceiver = resultExpression.explicitReceiver?.unwrapSmartcastExpression() + if (initialExplicitReceiver !== resultExplicitReceiver && resultExplicitReceiver is FirQualifiedAccessExpression) { + // name.invoke() case + callCompleter.completeCall(resultExplicitReceiver, ResolutionMode.ContextIndependent) + } + val completeInference = callCompleter.completeCall(resultExpression, data) val result = completeInference.transformToIntegerOperatorCallOrApproximateItIfNeeded(data) if (!resolvingAugmentedAssignment) { - dataFlowAnalyzer.exitFunctionCall(result, callCompleted) + dataFlowAnalyzer.exitFunctionCall(result, data.forceFullCompletion) } addReceiversFromExtensions(result) - if (callCompleted) { - if (enableArrayOfCallTransformation) { - return arrayOfCallTransformer.transformFunctionCall(result, null) - } + if (enableArrayOfCallTransformation) { + return arrayOfCallTransformer.transformFunctionCall(result, null) } return result } @@ -970,11 +965,11 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT .transformAnnotations(transformer, ResolutionMode.ContextIndependent) .replaceArgumentList(checkNotNullCall.argumentList.transform(transformer, ResolutionMode.ContextDependent)) - val (result, callCompleted) = callCompleter.completeCall( + val result = callCompleter.completeCall( components.syntheticCallGenerator.generateCalleeForCheckNotNullCall(checkNotNullCall, resolutionContext), data ) - dataFlowAnalyzer.exitCheckNotNullCall(result, callCompleted) + dataFlowAnalyzer.exitCheckNotNullCall(result, data.forceFullCompletion) return result } @@ -1328,8 +1323,8 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT // it seems that we may leave this code as is // without adding `context.withTowerDataContext(context.getTowerDataContextForConstructorResolution())` - val (result, callCompleted) = callCompleter.completeCall(resolvedCall, ResolutionMode.ContextIndependent) - dataFlowAnalyzer.exitDelegatedConstructorCall(result, callCompleted) + val result = callCompleter.completeCall(resolvedCall, ResolutionMode.ContextIndependent) + dataFlowAnalyzer.exitDelegatedConstructorCall(result, data.forceFullCompletion) return result } diff --git a/compiler/testData/codegen/box/smartCasts/kt44814.dot b/compiler/testData/codegen/box/smartCasts/kt44814.dot index 498b25f957a..d90b574272a 100644 --- a/compiler/testData/codegen/box/smartCasts/kt44814.dot +++ b/compiler/testData/codegen/box/smartCasts/kt44814.dot @@ -706,8 +706,9 @@ digraph kt44814_kt { 191 -> {192}; 192 -> {193}; 193 -> {194}; - 194 -> {195}; 194 -> {182} [color=green style=dashed]; + 194 -> {195} [color=green]; + 194 -> {202} [style=dotted]; 195 -> {196}; 196 -> {197 201}; 197 -> {198};