From cb8cb1f61012aea68c342f864785e86b37697543 Mon Sep 17 00:00:00 2001 From: pyos Date: Fri, 9 Dec 2022 19:41:58 +0100 Subject: [PATCH] FIR CFA: attach accessors and nested classes as class subgraphs --- .../cfg/innerClassInAnonymousObject.dot | 65 ++- .../resolve/smartcasts/nullability.dot | 49 ++- .../delegates/delegateWithAnonymousObject.dot | 114 +++--- .../dfa/cfg/ControlFlowGraphBuilder.kt | 30 +- .../codegen/box/smartCasts/kt44814.dot | 378 +++++++++--------- 5 files changed, 315 insertions(+), 321 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.dot index 0cd687a7d2c..f73ad1d41ca 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.dot @@ -4,40 +4,10 @@ digraph innerClassInAnonymousObject_kt { edge [penwidth=2] subgraph cluster_0 { - color=red - 10 [label="Enter class Nested" style="filled" fillcolor=red]; - 11 [label="Exit class Nested" style="filled" fillcolor=red]; - } - subgraph cluster_1 { - color=blue - 6 [label="Enter function foo" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 7 [label="Enter block"]; - 8 [label="Exit block"]; - } - 9 [label="Exit function foo" style="filled" fillcolor=red]; - } - subgraph cluster_3 { - color=blue - 3 [label="Enter function " style="filled" fillcolor=red]; - 4 [label="Delegated constructor call: super()" style="filled" fillcolor=yellow]; - 5 [label="Exit function " style="filled" fillcolor=red]; - } - 10 -> {11} [color=green]; - 11 -> {3 6} [color=green]; - 11 -> {3 6} [style=dashed]; - 3 -> {4}; - 4 -> {5}; - 6 -> {7}; - 7 -> {8}; - 8 -> {9}; - - subgraph cluster_4 { color=red 14 [label="Enter property" style="filled" fillcolor=red]; 15 [label="Enter anonymous object"]; - subgraph cluster_5 { + subgraph cluster_1 { color=blue 12 [label="Enter class " style="filled" fillcolor=red]; 13 [label="Exit class " style="filled" fillcolor=red]; @@ -46,6 +16,27 @@ digraph innerClassInAnonymousObject_kt { 17 [label="Exit anonymous object expression"]; 18 [label="Exit property" style="filled" fillcolor=red]; } + subgraph cluster_2 { + color=blue + 10 [label="Enter class Nested" style="filled" fillcolor=red]; + 11 [label="Exit class Nested" style="filled" fillcolor=red]; + } + subgraph cluster_3 { + color=blue + 6 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_4 { + color=blue + 7 [label="Enter block"]; + 8 [label="Exit block"]; + } + 9 [label="Exit function foo" style="filled" fillcolor=red]; + } + subgraph cluster_5 { + color=blue + 3 [label="Enter function " style="filled" fillcolor=red]; + 4 [label="Delegated constructor call: super()" style="filled" fillcolor=yellow]; + 5 [label="Exit function " style="filled" fillcolor=red]; + } subgraph cluster_6 { color=blue 0 [label="Enter function " style="filled" fillcolor=red]; @@ -60,9 +51,17 @@ digraph innerClassInAnonymousObject_kt { 16 -> {17}; 17 -> {18}; 12 -> {13} [color=green]; - 13 -> {0 16} [color=green]; - 13 -> {0} [style=dashed]; + 13 -> {0 10 16} [color=green]; + 13 -> {0 10} [style=dashed]; 0 -> {1}; 1 -> {2}; + 10 -> {11} [color=green]; + 11 -> {3 6} [color=green]; + 11 -> {3 6} [style=dashed]; + 3 -> {4}; + 4 -> {5}; + 6 -> {7}; + 7 -> {8}; + 8 -> {9}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot index 27b73e01e24..78e75c75c8d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot @@ -155,35 +155,14 @@ digraph nullability_kt { 41 -> {42} [style=dotted]; subgraph cluster_17 { - color=red - 49 [label="Enter function getter" style="filled" fillcolor=red]; - subgraph cluster_18 { - color=blue - 50 [label="Enter block"]; - 51 [label="Const: Null(null)"]; - 52 [label="Jump: ^ Null(null)"]; - 53 [label="Stub" style="filled" fillcolor=gray]; - 54 [label="Exit block" style="filled" fillcolor=gray]; - } - 55 [label="Exit function getter" style="filled" fillcolor=red]; - } - 49 -> {50}; - 50 -> {51}; - 51 -> {52}; - 52 -> {55}; - 52 -> {53} [style=dotted]; - 53 -> {54} [style=dotted]; - 54 -> {55} [style=dotted]; - - subgraph cluster_19 { color=red 63 [label="Enter class QImplWithCustomGetter" style="filled" fillcolor=red]; 64 [label="Exit class QImplWithCustomGetter" style="filled" fillcolor=red]; } - subgraph cluster_20 { + subgraph cluster_18 { color=blue 56 [label="Enter function fdata" style="filled" fillcolor=red]; - subgraph cluster_21 { + subgraph cluster_19 { color=blue 57 [label="Enter block"]; 58 [label="Const: Null(null)"]; @@ -193,6 +172,19 @@ digraph nullability_kt { } 62 [label="Exit function fdata" style="filled" fillcolor=red]; } + subgraph cluster_20 { + color=blue + 49 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_21 { + color=blue + 50 [label="Enter block"]; + 51 [label="Const: Null(null)"]; + 52 [label="Jump: ^ Null(null)"]; + 53 [label="Stub" style="filled" fillcolor=gray]; + 54 [label="Exit block" style="filled" fillcolor=gray]; + } + 55 [label="Exit function getter" style="filled" fillcolor=red]; + } subgraph cluster_22 { color=blue 46 [label="Enter function " style="filled" fillcolor=red]; @@ -200,10 +192,17 @@ digraph nullability_kt { 48 [label="Exit function " style="filled" fillcolor=red]; } 63 -> {64} [color=green]; - 64 -> {46 56} [color=green]; - 64 -> {46 56} [style=dashed]; + 64 -> {46 49 56} [color=green]; + 64 -> {46 49 56} [style=dashed]; 46 -> {47}; 47 -> {48}; + 49 -> {50}; + 50 -> {51}; + 51 -> {52}; + 52 -> {55}; + 52 -> {53} [style=dotted]; + 53 -> {54} [style=dotted]; + 54 -> {55} [style=dotted]; 56 -> {57}; 57 -> {58}; 58 -> {59}; diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot index b78de7f6045..6a3b54d7316 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot @@ -75,68 +75,21 @@ digraph delegateWithAnonymousObject_kt { 19 -> {20}; subgraph cluster_8 { - color=red - 54 [label="Enter function getter" style="filled" fillcolor=red]; - subgraph cluster_9 { - color=blue - 55 [label="Enter block"]; - 56 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 57 [label="Access variable this@R|/IssuesListUserProfile|"]; - 58 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; - 59 [label="Jump: ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; - 60 [label="Stub" style="filled" fillcolor=gray]; - 61 [label="Exit block" style="filled" fillcolor=gray]; - } - 62 [label="Exit function getter" style="filled" fillcolor=red]; - } - 54 -> {55}; - 55 -> {56}; - 56 -> {57}; - 57 -> {58}; - 58 -> {59}; - 59 -> {62}; - 59 -> {60} [style=dotted]; - 60 -> {61} [style=dotted]; - 61 -> {62} [style=dotted]; - - subgraph cluster_10 { - color=red - 63 [label="Enter function setter" style="filled" fillcolor=red]; - subgraph cluster_11 { - color=blue - 64 [label="Enter block"]; - 65 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 66 [label="Access variable this@R|/IssuesListUserProfile|"]; - 67 [label="Access variable R|/issueListView|"]; - 68 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; - 69 [label="Exit block"]; - } - 70 [label="Exit function setter" style="filled" fillcolor=red]; - } - 63 -> {64}; - 64 -> {65}; - 65 -> {66}; - 66 -> {67}; - 67 -> {68}; - 68 -> {69}; - 69 -> {70}; - - subgraph cluster_12 { color=red 79 [label="Enter class IssuesListUserProfile" style="filled" fillcolor=red]; 80 [label="Part of class initialization"]; - subgraph cluster_13 { + subgraph cluster_9 { color=blue 71 [label="Enter property" style="filled" fillcolor=red]; 72 [label="Postponed enter to lambda"]; - subgraph cluster_14 { + subgraph cluster_10 { color=blue 26 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - subgraph cluster_15 { + subgraph cluster_11 { color=blue 27 [label="Enter block"]; 28 [label="Enter anonymous object"]; - subgraph cluster_16 { + subgraph cluster_12 { color=blue 33 [label="Enter class " style="filled" fillcolor=red]; 34 [label="Exit class " style="filled" fillcolor=red]; @@ -147,10 +100,10 @@ digraph delegateWithAnonymousObject_kt { } 32 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - subgraph cluster_17 { + subgraph cluster_13 { color=blue 45 [label="Enter function setValue" style="filled" fillcolor=red]; - subgraph cluster_18 { + subgraph cluster_14 { color=blue 46 [label="Enter block"]; 47 [label="Function call: R|/IssueListView.IssueListView|()" style="filled" fillcolor=yellow]; @@ -162,10 +115,10 @@ digraph delegateWithAnonymousObject_kt { } 53 [label="Exit function setValue" style="filled" fillcolor=red]; } - subgraph cluster_19 { + subgraph cluster_15 { color=blue 38 [label="Enter function getValue" style="filled" fillcolor=red]; - subgraph cluster_20 { + subgraph cluster_16 { color=blue 39 [label="Enter block"]; 40 [label="Function call: R|/IssueListView.IssueListView|()" style="filled" fillcolor=yellow]; @@ -175,7 +128,7 @@ digraph delegateWithAnonymousObject_kt { } 44 [label="Exit function getValue" style="filled" fillcolor=red]; } - subgraph cluster_21 { + subgraph cluster_17 { color=blue 35 [label="Enter function " style="filled" fillcolor=red]; 36 [label="Delegated constructor call: super()" style="filled" fillcolor=yellow]; @@ -190,6 +143,35 @@ digraph delegateWithAnonymousObject_kt { } 81 [label="Exit class IssuesListUserProfile" style="filled" fillcolor=red]; } + subgraph cluster_18 { + color=blue + 63 [label="Enter function setter" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 64 [label="Enter block"]; + 65 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; + 66 [label="Access variable this@R|/IssuesListUserProfile|"]; + 67 [label="Access variable R|/issueListView|"]; + 68 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; + 69 [label="Exit block"]; + } + 70 [label="Exit function setter" style="filled" fillcolor=red]; + } + subgraph cluster_20 { + color=blue + 54 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_21 { + color=blue + 55 [label="Enter block"]; + 56 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; + 57 [label="Access variable this@R|/IssuesListUserProfile|"]; + 58 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; + 59 [label="Jump: ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; + 60 [label="Stub" style="filled" fillcolor=gray]; + 61 [label="Exit block" style="filled" fillcolor=gray]; + } + 62 [label="Exit function getter" style="filled" fillcolor=red]; + } subgraph cluster_22 { color=blue 23 [label="Enter function " style="filled" fillcolor=red]; @@ -200,8 +182,8 @@ digraph delegateWithAnonymousObject_kt { 80 -> {71} [color=green]; 80 -> {81} [style=dotted]; 80 -> {71} [style=dashed]; - 81 -> {23} [color=green]; - 81 -> {23} [style=dashed]; + 81 -> {23 54 63} [color=green]; + 81 -> {23 54 63} [style=dashed]; 71 -> {72}; 72 -> {26 73 74}; 72 -> {26} [style=dashed]; @@ -244,5 +226,21 @@ digraph delegateWithAnonymousObject_kt { 52 -> {53} [style=dotted]; 23 -> {24}; 24 -> {25}; + 54 -> {55}; + 55 -> {56}; + 56 -> {57}; + 57 -> {58}; + 58 -> {59}; + 59 -> {62}; + 59 -> {60} [style=dotted]; + 60 -> {61} [style=dotted]; + 61 -> {62} [style=dotted]; + 63 -> {64}; + 64 -> {65}; + 65 -> {66}; + 66 -> {67}; + 67 -> {68}; + 68 -> {69}; + 69 -> {70}; } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index 341fcdbbe13..8efdd027659 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -419,21 +419,27 @@ class ControlFlowGraphBuilder { else -> throw IllegalArgumentException("Unknown class kind: ${klass::class}") } + val calledInPlace = mutableListOf() + val calledLater = mutableListOf() + for (declaration in klass.declarations) { + if (declaration is FirControlFlowGraphOwner) { + // TODO: constructors are also called-in-place, but after everything else, and only one of them is chosen. + val target = if (declaration is FirFunction || declaration is FirClass) calledLater else calledInPlace + declaration.controlFlowGraphReference?.controlFlowGraph?.let(target::add) + } + if (declaration is FirProperty) { + declaration.getter?.controlFlowGraphReference?.controlFlowGraph?.let(calledLater::add) + declaration.setter?.controlFlowGraphReference?.controlFlowGraph?.let(calledLater::add) + } + } + val classGraph = ControlFlowGraph(klass, name, ControlFlowGraph.Kind.ClassInitializer) pushGraph(classGraph, Mode.ClassInitializer) val exitNode = createClassExitNode(klass) var node: CFGNode<*> = createClassEnterNode(klass) var prevInitPartNode: CFGNode<*>? = null - for (declaration in klass.declarations) { - val graph = when (declaration) { - // TODO: property accessors? - is FirProperty -> declaration.controlFlowGraphReference?.controlFlowGraph - is FirField -> declaration.controlFlowGraphReference?.controlFlowGraph - is FirAnonymousInitializer -> declaration.controlFlowGraphReference?.controlFlowGraph - else -> null - } ?: continue - - createPartOfClassInitializationNode(declaration as FirControlFlowGraphOwner).also { + for (graph in calledInPlace) { + createPartOfClassInitializationNode(graph.declaration as FirControlFlowGraphOwner).also { currentGraph.addSubGraph(graph) addEdge(node, it, preferredKind = EdgeKind.CfgForward) addEdge(it, graph.enterNode, preferredKind = EdgeKind.CfgForward) @@ -456,9 +462,7 @@ class ControlFlowGraphBuilder { // init { x = bar() } // } // println(x) - for (declaration in klass.declarations) { - if (declaration !is FirFunction) continue - val graph = declaration.controlFlowGraphReference?.controlFlowGraph ?: continue + for (graph in calledLater) { addEdge(exitNode, graph.enterNode, preferredKind = EdgeKind.CfgForward) exitNode.addSubGraph(graph) currentGraph.addSubGraph(graph) diff --git a/compiler/testData/codegen/box/smartCasts/kt44814.dot b/compiler/testData/codegen/box/smartCasts/kt44814.dot index 5bf9e8d679c..e00a16f7f7d 100644 --- a/compiler/testData/codegen/box/smartCasts/kt44814.dot +++ b/compiler/testData/codegen/box/smartCasts/kt44814.dot @@ -251,9 +251,14 @@ digraph kt44814_kt { subgraph cluster_24 { color=red + 88 [label="Enter class TokenType [1]" style="filled" fillcolor=red]; + 89 [label="Exit class TokenType [1]" style="filled" fillcolor=red]; + } + subgraph cluster_25 { + color=blue 85 [label="Enter class Companion [2]" style="filled" fillcolor=red]; 86 [label="Part of class initialization [2]"]; - subgraph cluster_25 { + subgraph cluster_26 { color=blue 82 [label="Enter property [3]" style="filled" fillcolor=red]; 83 [label="Function call: R|/TokenType.TokenType|() [3]" style="filled" fillcolor=yellow]; @@ -261,12 +266,23 @@ digraph kt44814_kt { } 87 [label="Exit class Companion [2]" style="filled" fillcolor=red]; } - subgraph cluster_26 { + subgraph cluster_27 { color=blue 79 [label="Enter function [3]" style="filled" fillcolor=red]; 80 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; 81 [label="Exit function [3]" style="filled" fillcolor=red]; } + subgraph cluster_28 { + color=blue + 76 [label="Enter function [2]" style="filled" fillcolor=red]; + 77 [label="Delegated constructor call: super() [2]" style="filled" fillcolor=yellow]; + 78 [label="Exit function [2]" style="filled" fillcolor=red]; + } + 88 -> {89} [color=green]; + 89 -> {76 85} [color=green]; + 89 -> {76 85} [style=dashed]; + 76 -> {77}; + 77 -> {78}; 85 -> {86} [color=green]; 86 -> {82} [color=green]; 86 -> {87} [style=dotted]; @@ -279,23 +295,6 @@ digraph kt44814_kt { 79 -> {80}; 80 -> {81}; - subgraph cluster_27 { - color=red - 88 [label="Enter class TokenType [1]" style="filled" fillcolor=red]; - 89 [label="Exit class TokenType [1]" style="filled" fillcolor=red]; - } - subgraph cluster_28 { - color=blue - 76 [label="Enter function [2]" style="filled" fillcolor=red]; - 77 [label="Delegated constructor call: super() [2]" style="filled" fillcolor=yellow]; - 78 [label="Exit function [2]" style="filled" fillcolor=red]; - } - 88 -> {89} [color=green]; - 89 -> {76} [color=green]; - 89 -> {76} [style=dashed]; - 76 -> {77}; - 77 -> {78}; - subgraph cluster_29 { color=red 93 [label="Enter class KtModifierKeywordToken [1]" style="filled" fillcolor=red]; @@ -362,30 +361,28 @@ digraph kt44814_kt { subgraph cluster_36 { color=red - 123 [label="Enter class FirPsiModifier [2]" style="filled" fillcolor=red]; - 124 [label="Exit class FirPsiModifier [2]" style="filled" fillcolor=red]; + 136 [label="Enter class FirModifier [1]" style="filled" fillcolor=red]; + 137 [label="Part of class initialization [1]"]; + subgraph cluster_37 { + color=blue + 112 [label="Enter property [2]" style="filled" fillcolor=red]; + 113 [label="Access variable R|/node| [2]"]; + 114 [label="Exit property [2]" style="filled" fillcolor=red]; + } + 138 [label="Part of class initialization [1]"]; + subgraph cluster_38 { + color=blue + 115 [label="Enter property [2]" style="filled" fillcolor=red]; + 116 [label="Access variable R|/token| [2]"]; + 117 [label="Exit property [2]" style="filled" fillcolor=red]; + } + 139 [label="Exit class FirModifier [1]" style="filled" fillcolor=red]; } - subgraph cluster_37 { + subgraph cluster_39 { color=blue - 118 [label="Enter function [3]" style="filled" fillcolor=red]; - 119 [label="Access variable R|/node| [4]"]; - 120 [label="Access variable R|/token| [4]"]; - 121 [label="Delegated constructor call: super|>(...) [3]" style="filled" fillcolor=yellow]; - 122 [label="Exit function [3]" style="filled" fillcolor=red]; - } - 123 -> {124} [color=green]; - 124 -> {118} [color=green]; - 124 -> {118} [style=dashed]; - 118 -> {119}; - 119 -> {120}; - 120 -> {121}; - 121 -> {122}; - - subgraph cluster_38 { - color=red 133 [label="Enter class FirLightModifier [2]" style="filled" fillcolor=red]; 134 [label="Part of class initialization [2]"]; - subgraph cluster_39 { + subgraph cluster_40 { color=blue 130 [label="Enter property [3]" style="filled" fillcolor=red]; 131 [label="Access variable R|/tree| [3]"]; @@ -393,7 +390,7 @@ digraph kt44814_kt { } 135 [label="Exit class FirLightModifier [2]" style="filled" fillcolor=red]; } - subgraph cluster_40 { + subgraph cluster_41 { color=blue 125 [label="Enter function [3]" style="filled" fillcolor=red]; 126 [label="Access variable R|/node| [4]"]; @@ -401,38 +398,18 @@ digraph kt44814_kt { 128 [label="Delegated constructor call: super|>(...) [3]" style="filled" fillcolor=yellow]; 129 [label="Exit function [3]" style="filled" fillcolor=red]; } - 133 -> {134} [color=green]; - 134 -> {130} [color=green]; - 134 -> {135} [style=dotted]; - 134 -> {130} [style=dashed]; - 135 -> {125} [color=green]; - 135 -> {125} [style=dashed]; - 130 -> {131}; - 131 -> {132}; - 132 -> {135} [color=green]; - 125 -> {126}; - 126 -> {127}; - 127 -> {128}; - 128 -> {129}; - - subgraph cluster_41 { - color=red - 136 [label="Enter class FirModifier [1]" style="filled" fillcolor=red]; - 137 [label="Part of class initialization [1]"]; - subgraph cluster_42 { - color=blue - 112 [label="Enter property [2]" style="filled" fillcolor=red]; - 113 [label="Access variable R|/node| [2]"]; - 114 [label="Exit property [2]" style="filled" fillcolor=red]; - } - 138 [label="Part of class initialization [1]"]; - subgraph cluster_43 { - color=blue - 115 [label="Enter property [2]" style="filled" fillcolor=red]; - 116 [label="Access variable R|/token| [2]"]; - 117 [label="Exit property [2]" style="filled" fillcolor=red]; - } - 139 [label="Exit class FirModifier [1]" style="filled" fillcolor=red]; + subgraph cluster_42 { + color=blue + 123 [label="Enter class FirPsiModifier [2]" style="filled" fillcolor=red]; + 124 [label="Exit class FirPsiModifier [2]" style="filled" fillcolor=red]; + } + subgraph cluster_43 { + color=blue + 118 [label="Enter function [3]" style="filled" fillcolor=red]; + 119 [label="Access variable R|/node| [4]"]; + 120 [label="Access variable R|/token| [4]"]; + 121 [label="Delegated constructor call: super|>(...) [3]" style="filled" fillcolor=yellow]; + 122 [label="Exit function [3]" style="filled" fillcolor=red]; } subgraph cluster_44 { color=blue @@ -447,8 +424,8 @@ digraph kt44814_kt { 138 -> {115} [color=green]; 138 -> {139} [style=dotted]; 138 -> {115} [style=dashed]; - 139 -> {109} [color=green]; - 139 -> {109} [style=dashed]; + 139 -> {109 123 133} [color=green]; + 139 -> {109 123 133} [style=dashed]; 112 -> {113}; 113 -> {114}; 114 -> {138} [color=green]; @@ -457,89 +434,48 @@ digraph kt44814_kt { 117 -> {139} [color=green]; 109 -> {110}; 110 -> {111}; + 123 -> {124} [color=green]; + 124 -> {118} [color=green]; + 124 -> {118} [style=dashed]; + 118 -> {119}; + 119 -> {120}; + 120 -> {121}; + 121 -> {122}; + 133 -> {134} [color=green]; + 134 -> {130} [color=green]; + 134 -> {135} [style=dotted]; + 134 -> {130} [style=dashed]; + 135 -> {125} [color=green]; + 135 -> {125} [style=dashed]; + 130 -> {131}; + 131 -> {132}; + 132 -> {135} [color=green]; + 125 -> {126}; + 126 -> {127}; + 127 -> {128}; + 128 -> {129}; subgraph cluster_45 { color=red - 152 [label="Enter class FirPsiModifierList [2]" style="filled" fillcolor=red]; - 153 [label="Part of class initialization [2]"]; + 286 [label="Enter class FirModifierList [1]" style="filled" fillcolor=red]; + 287 [label="Part of class initialization [1]"]; subgraph cluster_46 { color=blue - 149 [label="Enter property [3]" style="filled" fillcolor=red]; - 150 [label="Access variable R|/modifierList| [3]"]; - 151 [label="Exit property [3]" style="filled" fillcolor=red]; + 143 [label="Enter property [2]" style="filled" fillcolor=red]; + 144 [label="Function call: R|kotlin/collections/emptyList||>() [2]" style="filled" fillcolor=yellow]; + 145 [label="Exit property [2]" style="filled" fillcolor=red]; } - 154 [label="Exit class FirPsiModifierList [2]" style="filled" fillcolor=red]; + 288 [label="Exit class FirModifierList [1]" style="filled" fillcolor=red]; } subgraph cluster_47 { color=blue - 146 [label="Enter function [3]" style="filled" fillcolor=red]; - 147 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; - 148 [label="Exit function [3]" style="filled" fillcolor=red]; - } - 152 -> {153} [color=green]; - 153 -> {149} [color=green]; - 153 -> {154} [style=dotted]; - 153 -> {149} [style=dashed]; - 154 -> {146} [color=green]; - 154 -> {146} [style=dashed]; - 149 -> {150}; - 150 -> {151}; - 151 -> {154} [color=green]; - 146 -> {147}; - 147 -> {148}; - - subgraph cluster_48 { - color=red - 164 [label="Enter class FirLightModifierList [2]" style="filled" fillcolor=red]; - 165 [label="Part of class initialization [2]"]; - subgraph cluster_49 { - color=blue - 158 [label="Enter property [3]" style="filled" fillcolor=red]; - 159 [label="Access variable R|/modifierList| [3]"]; - 160 [label="Exit property [3]" style="filled" fillcolor=red]; - } - 166 [label="Part of class initialization [2]"]; - subgraph cluster_50 { - color=blue - 161 [label="Enter property [3]" style="filled" fillcolor=red]; - 162 [label="Access variable R|/tree| [3]"]; - 163 [label="Exit property [3]" style="filled" fillcolor=red]; - } - 167 [label="Exit class FirLightModifierList [2]" style="filled" fillcolor=red]; - } - subgraph cluster_51 { - color=blue - 155 [label="Enter function [3]" style="filled" fillcolor=red]; - 156 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; - 157 [label="Exit function [3]" style="filled" fillcolor=red]; - } - 164 -> {165} [color=green]; - 165 -> {158} [color=green]; - 165 -> {166} [style=dotted]; - 165 -> {158} [style=dashed]; - 166 -> {161} [color=green]; - 166 -> {167} [style=dotted]; - 166 -> {161} [style=dashed]; - 167 -> {155} [color=green]; - 167 -> {155} [style=dashed]; - 158 -> {159}; - 159 -> {160}; - 160 -> {166} [color=green]; - 161 -> {162}; - 162 -> {163}; - 163 -> {167} [color=green]; - 155 -> {156}; - 156 -> {157}; - - subgraph cluster_52 { - color=red 284 [label="Enter class Companion [2]" style="filled" fillcolor=red]; 285 [label="Exit class Companion [2]" style="filled" fillcolor=red]; } - subgraph cluster_53 { + subgraph cluster_48 { color=blue 251 [label="Enter function boxImpl [3]" style="filled" fillcolor=red]; - subgraph cluster_54 { + subgraph cluster_49 { color=blue 252 [label="Enter block [3]"]; 253 [label="Function call: R|/LighterASTNode.LighterASTNode|() [6]" style="filled" fillcolor=yellow]; @@ -551,23 +487,23 @@ digraph kt44814_kt { 259 [label="Access variable R|/sourceElement| [4]"]; 260 [label="Function call: (this@R|/FirModifierList.Companion|, R|/sourceElement|).R|/FirModifierList.Companion.getModifierList|() [3]" style="filled" fillcolor=yellow]; 261 [label="Variable declaration: lval result: R|FirModifierList?| [3]"]; - subgraph cluster_55 { + subgraph cluster_50 { color=blue 262 [label="Enter when [3]"]; - subgraph cluster_56 { + subgraph cluster_51 { color=blue 263 [label="Enter when branch condition [4]"]; 264 [label="Access variable R|/result| [5]"]; 265 [label="Type operator: (R|/result| is R|FirModifierList.FirLightModifierList|) [5]"]; 266 [label="Exit when branch condition [4]"]; } - subgraph cluster_57 { + subgraph cluster_52 { color=blue 267 [label="Enter when branch condition else [5]"]; 268 [label="Exit when branch condition [5]"]; } 269 [label="Enter when branch result [6]"]; - subgraph cluster_58 { + subgraph cluster_53 { color=blue 270 [label="Enter block [6]"]; 271 [label="Const: String(Fail) [6]"]; @@ -575,7 +511,7 @@ digraph kt44814_kt { } 273 [label="Exit when branch result [5]"]; 274 [label="Enter when branch result [5]"]; - subgraph cluster_59 { + subgraph cluster_54 { color=blue 275 [label="Enter block [5]"]; 276 [label="Const: String(OK) [5]"]; @@ -598,17 +534,17 @@ digraph kt44814_kt { } 283 [label="Exit function boxImpl [3]" style="filled" fillcolor=red]; } - subgraph cluster_60 { + subgraph cluster_55 { color=blue 171 [label="Enter function getModifierList [3]" style="filled" fillcolor=red]; - subgraph cluster_61 { + subgraph cluster_56 { color=blue 172 [label="Enter block [3]"]; - subgraph cluster_62 { + subgraph cluster_57 { color=blue 173 [label="Enter when [3]"]; 174 [label="Access variable this@R|/FirModifierList.Companion.getModifierList| [4]"]; - subgraph cluster_63 { + subgraph cluster_58 { color=blue 175 [label="Enter when branch condition [4]"]; 176 [label="Exit $subj [5]"]; @@ -616,14 +552,14 @@ digraph kt44814_kt { 178 [label="Equality operator == [5]"]; 179 [label="Exit when branch condition [4]"]; } - subgraph cluster_64 { + subgraph cluster_59 { color=blue 180 [label="Enter when branch condition [5]"]; 181 [label="Exit $subj [6]"]; 182 [label="Type operator: ($subj$ is R|FirPsiSourceElement|) [6]"]; 183 [label="Exit when branch condition [5]"]; } - subgraph cluster_65 { + subgraph cluster_60 { color=blue 184 [label="Enter when branch condition [6]"]; 185 [label="Exit $subj [7]"]; @@ -631,17 +567,17 @@ digraph kt44814_kt { 187 [label="Exit when branch condition [6]"]; } 188 [label="Enter when branch result [7]"]; - subgraph cluster_66 { + subgraph cluster_61 { color=blue 189 [label="Enter block [7]"]; 190 [label="Access variable R|/FirLightSourceElement.lighterASTNode| [9]"]; 191 [label="Access variable R|/FirLightSourceElement.treeStructure| [9]"]; 192 [label="Function call: this@R|/FirModifierList.Companion.getModifierList|.R|/FirLightSourceElement.lighterASTNode|.R|/LighterASTNode.getChildren|(...) [8]" style="filled" fillcolor=yellow]; 193 [label="Postponed enter to lambda [8]"]; - subgraph cluster_67 { + subgraph cluster_62 { color=blue 240 [label="Enter function anonymousFunction [9]" style="filled" fillcolor=red]; - subgraph cluster_68 { + subgraph cluster_63 { color=blue 241 [label="Enter block [9]"]; 242 [label="Access variable R|/it| [9]"]; @@ -672,7 +608,7 @@ digraph kt44814_kt { } 208 [label="Exit when branch result [6]"]; 209 [label="Enter when branch result [6]"]; - subgraph cluster_69 { + subgraph cluster_64 { color=blue 210 [label="Enter block [6]"]; 211 [label="Access variable R|/FirPsiSourceElement.psi| [6]"]; @@ -681,10 +617,10 @@ digraph kt44814_kt { 214 [label="Access variable R|/KtModifierListOwner.modifierList| [6]"]; 215 [label="Enter safe call [6]"]; 216 [label="Postponed enter to lambda [7]"]; - subgraph cluster_70 { + subgraph cluster_65 { color=blue 234 [label="Enter function anonymousFunction [8]" style="filled" fillcolor=red]; - subgraph cluster_71 { + subgraph cluster_66 { color=blue 235 [label="Enter block [8]"]; 236 [label="Access variable R|/it| [9]"]; @@ -702,7 +638,7 @@ digraph kt44814_kt { 222 [label="Exit when branch result [5]"]; 223 [label="Merge postponed lambda exits [6]"]; 224 [label="Enter when branch result [5]"]; - subgraph cluster_72 { + subgraph cluster_67 { color=blue 225 [label="Enter block [5]"]; 226 [label="Const: Null(null) [5]"]; @@ -735,12 +671,100 @@ digraph kt44814_kt { } 233 [label="Exit function getModifierList [3]" style="filled" fillcolor=red]; } - subgraph cluster_73 { + subgraph cluster_68 { color=blue 168 [label="Enter function [3]" style="filled" fillcolor=red]; 169 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; 170 [label="Exit function [3]" style="filled" fillcolor=red]; } + subgraph cluster_69 { + color=blue + 164 [label="Enter class FirLightModifierList [2]" style="filled" fillcolor=red]; + 165 [label="Part of class initialization [2]"]; + subgraph cluster_70 { + color=blue + 158 [label="Enter property [3]" style="filled" fillcolor=red]; + 159 [label="Access variable R|/modifierList| [3]"]; + 160 [label="Exit property [3]" style="filled" fillcolor=red]; + } + 166 [label="Part of class initialization [2]"]; + subgraph cluster_71 { + color=blue + 161 [label="Enter property [3]" style="filled" fillcolor=red]; + 162 [label="Access variable R|/tree| [3]"]; + 163 [label="Exit property [3]" style="filled" fillcolor=red]; + } + 167 [label="Exit class FirLightModifierList [2]" style="filled" fillcolor=red]; + } + subgraph cluster_72 { + color=blue + 155 [label="Enter function [3]" style="filled" fillcolor=red]; + 156 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; + 157 [label="Exit function [3]" style="filled" fillcolor=red]; + } + subgraph cluster_73 { + color=blue + 152 [label="Enter class FirPsiModifierList [2]" style="filled" fillcolor=red]; + 153 [label="Part of class initialization [2]"]; + subgraph cluster_74 { + color=blue + 149 [label="Enter property [3]" style="filled" fillcolor=red]; + 150 [label="Access variable R|/modifierList| [3]"]; + 151 [label="Exit property [3]" style="filled" fillcolor=red]; + } + 154 [label="Exit class FirPsiModifierList [2]" style="filled" fillcolor=red]; + } + subgraph cluster_75 { + color=blue + 146 [label="Enter function [3]" style="filled" fillcolor=red]; + 147 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; + 148 [label="Exit function [3]" style="filled" fillcolor=red]; + } + subgraph cluster_76 { + color=blue + 140 [label="Enter function [2]" style="filled" fillcolor=red]; + 141 [label="Delegated constructor call: super() [2]" style="filled" fillcolor=yellow]; + 142 [label="Exit function [2]" style="filled" fillcolor=red]; + } + 286 -> {287} [color=green]; + 287 -> {143} [color=green]; + 287 -> {288} [style=dotted]; + 287 -> {143} [style=dashed]; + 288 -> {140 152 164 284} [color=green]; + 288 -> {140 152 164 284} [style=dashed]; + 143 -> {144}; + 144 -> {145}; + 145 -> {288} [color=green]; + 140 -> {141}; + 141 -> {142}; + 152 -> {153} [color=green]; + 153 -> {149} [color=green]; + 153 -> {154} [style=dotted]; + 153 -> {149} [style=dashed]; + 154 -> {146} [color=green]; + 154 -> {146} [style=dashed]; + 149 -> {150}; + 150 -> {151}; + 151 -> {154} [color=green]; + 146 -> {147}; + 147 -> {148}; + 164 -> {165} [color=green]; + 165 -> {158} [color=green]; + 165 -> {166} [style=dotted]; + 165 -> {158} [style=dashed]; + 166 -> {161} [color=green]; + 166 -> {167} [style=dotted]; + 166 -> {161} [style=dashed]; + 167 -> {155} [color=green]; + 167 -> {155} [style=dashed]; + 158 -> {159}; + 159 -> {160}; + 160 -> {166} [color=green]; + 161 -> {162}; + 162 -> {163}; + 163 -> {167} [color=green]; + 155 -> {156}; + 156 -> {157}; 284 -> {285} [color=green]; 285 -> {168 171 251} [color=green]; 285 -> {168 171 251} [style=dashed]; @@ -866,36 +890,6 @@ digraph kt44814_kt { 281 -> {282} [style=dotted]; 282 -> {283} [style=dotted]; - subgraph cluster_74 { - color=red - 286 [label="Enter class FirModifierList [1]" style="filled" fillcolor=red]; - 287 [label="Part of class initialization [1]"]; - subgraph cluster_75 { - color=blue - 143 [label="Enter property [2]" style="filled" fillcolor=red]; - 144 [label="Function call: R|kotlin/collections/emptyList||>() [2]" style="filled" fillcolor=yellow]; - 145 [label="Exit property [2]" style="filled" fillcolor=red]; - } - 288 [label="Exit class FirModifierList [1]" style="filled" fillcolor=red]; - } - subgraph cluster_76 { - color=blue - 140 [label="Enter function [2]" style="filled" fillcolor=red]; - 141 [label="Delegated constructor call: super() [2]" style="filled" fillcolor=yellow]; - 142 [label="Exit function [2]" style="filled" fillcolor=red]; - } - 286 -> {287} [color=green]; - 287 -> {143} [color=green]; - 287 -> {288} [style=dotted]; - 287 -> {143} [style=dashed]; - 288 -> {140} [color=green]; - 288 -> {140} [style=dashed]; - 143 -> {144}; - 144 -> {145}; - 145 -> {288} [color=green]; - 140 -> {141}; - 141 -> {142}; - subgraph cluster_77 { color=red 289 [label="Enter function box [1]" style="filled" fillcolor=red];