diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileElementFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileElementFactory.kt index 2e41450c9b6..ce93b68a2a4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileElementFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileElementFactory.kt @@ -63,6 +63,10 @@ internal object FileElementFactory { val classMembersToResolve = buildList { for (member in firClass.declarations) { when { + member is FirSimpleFunction && member.source?.kind == KtFakeSourceElementKind.DataClassGeneratedMembers -> { + add(member) + } + member is FirPrimaryConstructor && member.source?.kind == KtFakeSourceElementKind.ImplicitConstructor -> { add(member) } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt index 6bf68f98ef9..8ee274ef03c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataCo import org.jetbrains.kotlin.fir.resolve.transformers.contracts.FirContractsDslNames import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isUsedInControlFlowGraphBuilderForClass internal object LLFirBodyLazyResolver : LLFirLazyResolver(FirResolvePhase.BODY_RESOLVE) { override fun resolve( @@ -136,10 +137,7 @@ private class LLFirBodyTargetResolver( transformer.firTowerDataContextCollector?.addDeclarationContext(target, transformer.context.towerDataContext) for (member in target.declarations) { - if (member is FirCallableDeclaration || member is FirAnonymousInitializer) { - // TODO: Ideally, only properties and init blocks should be resolved here. - // However, dues to changes in the compiler resolution, we temporarily have to resolve all callable members. - // Such additional work might affect incremental analysis performance. + if (member is FirControlFlowGraphOwner && member.isUsedInControlFlowGraphBuilderForClass) { member.lazyResolveToPhase(resolverPhase.previous) performResolve(member) } diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.txt index 80e5ffd90b6..c3e6e9d0e89 100644 --- a/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.txt +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/invalidCode/secondaryConstructor.txt @@ -13,12 +13,10 @@ FILE: [ResolvedTo(IMPORTS)] secondaryConstructor.kt super() } - public final [ResolvedTo(BODY_RESOLVE)] val value: R|kotlin/String| - public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=JsQualifier] get(): R|kotlin/String| + public final [ResolvedTo(STATUS)] val value: R|kotlin/String| + public [ResolvedTo(STATUS)] [ContainingClassKey=JsQualifier] get(): R|kotlin/String| - public final [ResolvedTo(BODY_RESOLVE)] fun (): R|kotlin/Unit| { - # - } + public final [ResolvedTo(STATUS)] fun (): R|kotlin/Unit| { LAZY_BLOCK } - } + } \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/wholeDeclaration/nestedClass.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/wholeDeclaration/nestedClass.txt index b119d6e2a81..5a08fc11ff1 100644 --- a/analysis/low-level-api-fir/testdata/getOrBuildFir/wholeDeclaration/nestedClass.txt +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/wholeDeclaration/nestedClass.txt @@ -8,7 +8,7 @@ public final [ResolvedTo(BODY_RESOLVE)] class X : R|kotlin/Any| { super() } - public final [ResolvedTo(BODY_RESOLVE)] fun y(): R|kotlin/String| + public final [ResolvedTo(STATUS)] fun y(): R|kotlin/String| } @@ -25,8 +25,8 @@ FILE: [ResolvedTo(IMPORTS)] nestedClass.kt super() } - public final [ResolvedTo(BODY_RESOLVE)] fun y(): R|kotlin/String| + public final [ResolvedTo(STATUS)] fun y(): R|kotlin/String| } - } + } \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/wholeDeclaration/topLevelClass.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/wholeDeclaration/topLevelClass.txt index 856e71e493e..fc32ea63eb4 100644 --- a/analysis/low-level-api-fir/testdata/getOrBuildFir/wholeDeclaration/topLevelClass.txt +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/wholeDeclaration/topLevelClass.txt @@ -8,7 +8,7 @@ public final [ResolvedTo(BODY_RESOLVE)] class X : R|kotlin/Any| { super() } - public final [ResolvedTo(BODY_RESOLVE)] fun y(): R|kotlin/String| + public final [ResolvedTo(STATUS)] fun y(): R|kotlin/String| } @@ -20,6 +20,6 @@ FILE: [ResolvedTo(IMPORTS)] topLevelClass.kt super() } - public final [ResolvedTo(BODY_RESOLVE)] fun y(): R|kotlin/String| + public final [ResolvedTo(STATUS)] fun y(): R|kotlin/String| - } + } \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/actual.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/actual.txt index 2cd5c8f6767..646347a28b3 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/actual.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/actual.txt @@ -294,8 +294,7 @@ FILE: [ResolvedTo(IMPORTS)] actual.kt super() } - public final [ResolvedTo(BODY_RESOLVE)] fun memberFun(): R|kotlin/Unit| { - } + public final [ResolvedTo(STATUS)] fun memberFun(): R|kotlin/Unit| { LAZY_BLOCK } public final [ResolvedTo(BODY_RESOLVE)] val a: R|kotlin/Int| = Int(1) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Actual] get(): R|kotlin/Int| diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverride.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverride.txt index e5b89802d9a..17b9d3772a0 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverride.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverride.txt @@ -384,8 +384,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverride.kt super() } - public open override [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Unit| { - } + public open override [ResolvedTo(STATUS)] fun foo(): R|kotlin/Unit| { LAZY_BLOCK } } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass2.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass2.txt index e2f587ed7f7..d22393bea1f 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass2.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass2.txt @@ -906,8 +906,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass2.kt super() } - public open override [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Unit| { - } + public open override [ResolvedTo(STATUS)] fun foo(): R|kotlin/Unit| { LAZY_BLOCK } } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass3.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass3.txt index b35b2ed39db..8f943a9c967 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass3.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass3.txt @@ -897,8 +897,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass3.kt super() } - public final [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Unit| { - } + public final [ResolvedTo(STATUS)] fun foo(): R|kotlin/Unit| { LAZY_BLOCK } } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass4.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass4.txt index b91ced477e8..331dd1abf86 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass4.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/hierarchyWithOverrideAndNestedClass4.txt @@ -915,8 +915,7 @@ FILE: [ResolvedTo(IMPORTS)] hierarchyWithOverrideAndNestedClass4.kt super() } - public open override [ResolvedTo(BODY_RESOLVE)] fun bar([ResolvedTo(BODY_RESOLVE)] s: R|kotlin/String|): R|kotlin/Unit| { - } + public open override [ResolvedTo(STATUS)] fun bar([ResolvedTo(STATUS)] s: R|kotlin/String|): R|kotlin/Unit| { LAZY_BLOCK } } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.txt index f8ad427e807..3e36ad8f14d 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/nestedClassWithPropertiesOverrides.txt @@ -310,8 +310,8 @@ FILE: [ResolvedTo(IMPORTS)] nestedClassWithPropertiesOverrides.kt super() } - public open override [ResolvedTo(BODY_RESOLVE)] val originalExpressions: R|A| - public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=ResolveMe] get(): R|A| + public open override [ResolvedTo(STATUS)] val originalExpressions: R|A| + public [ResolvedTo(STATUS)] [ContainingClassKey=ResolveMe] get(): R|A| } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/simpleLoopInOverride.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/simpleLoopInOverride.txt index b3aa1afd435..a63f83ad589 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/simpleLoopInOverride.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/simpleLoopInOverride.txt @@ -194,7 +194,7 @@ BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] simpleLoopInOverride.kt [ResolvedTo(BODY_RESOLVE)] annotations container public abstract [ResolvedTo(BODY_RESOLVE)] interface Foo1 : /Foo2> { - public abstract override [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Unit| + public abstract override [ResolvedTo(STATUS)] fun foo(): R|kotlin/Unit| } public? final? [ResolvedTo(SUPER_TYPES)] interface Foo2 : /Foo3> { diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/classes/simpleLoopInOverride2.txt b/analysis/low-level-api-fir/testdata/lazyResolve/classes/simpleLoopInOverride2.txt index 45118b0bab9..0ea2beb12c9 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/classes/simpleLoopInOverride2.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/classes/simpleLoopInOverride2.txt @@ -194,7 +194,7 @@ BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] simpleLoopInOverride2.kt [ResolvedTo(BODY_RESOLVE)] annotations container public abstract [ResolvedTo(BODY_RESOLVE)] interface Foo1 : /Foo2> { - public abstract [ResolvedTo(BODY_RESOLVE)] fun foo(): R|kotlin/Unit| + public abstract [ResolvedTo(STATUS)] fun foo(): R|kotlin/Unit| } public? final? [ResolvedTo(SUPER_TYPES)] interface Foo2 : /Foo3> { diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/nestedCompilerRequiredAnnotations.txt b/analysis/low-level-api-fir/testdata/lazyResolve/nestedCompilerRequiredAnnotations.txt index b51708f2c85..0bf81f38fd9 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/nestedCompilerRequiredAnnotations.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/nestedCompilerRequiredAnnotations.txt @@ -762,8 +762,7 @@ FILE: [ResolvedTo(IMPORTS)] nestedCompilerRequiredAnnotations.kt @R|kotlin/Deprecated|[Types](message = String(constructorProperty)) public final [ResolvedTo(BODY_RESOLVE)] [IsFromPrimaryConstructor=true] val a: R|kotlin/Int| = R|/a| public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=FirstClass] get(): R|kotlin/Int| - @R|kotlin/Deprecated|[Types](message = String(memberFunction)) @R|Anno|[Types](s = String(memberFunction)) public final [ResolvedTo(BODY_RESOLVE)] fun memberFunction(): R|kotlin/Unit| { - } + @R|kotlin/Deprecated|[Types](String(memberFunction)) @R|Anno|[Types](LAZY_EXPRESSION) public final [ResolvedTo(STATUS)] fun memberFunction(): R|kotlin/Unit| { LAZY_BLOCK } @R|kotlin/Deprecated|[Types](message = String(memberProperty)) @R|Anno|[Types](s = String(memberProperty)) public final [ResolvedTo(BODY_RESOLVE)] val memberProperty: R|kotlin/Int| = Int(32) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=FirstClass] get(): R|kotlin/Int| diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass.txt b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass.txt index 16ca3a5c440..f1e569cf602 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/typeParameterOfClass.txt @@ -150,8 +150,7 @@ FILE: [ResolvedTo(IMPORTS)] typeParameterOfClass.kt super() } - public final [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] t: R|Type|): R|kotlin/Unit| { - } + public final [ResolvedTo(STATUS)] fun foo([ResolvedTo(STATUS)] t: R|Type|): R|kotlin/Unit| { LAZY_BLOCK } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java index 655c6d094b4..96a1fc0f35f 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java @@ -1391,6 +1391,12 @@ public class DiagnosticCompilerTestFirTestdataTestGenerated extends AbstractDiag runTest("compiler/fir/analysis-tests/testData/resolve/cfg/loops.kt"); } + @Test + @TestMetadata("nestedClass.kt") + public void testNestedClass() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.kt"); + } + @Test @TestMetadata("postponedLambdaInConstructor.kt") public void testPostponedLambdaInConstructor() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java index bb3bf932120..3d7e375addf 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java @@ -1391,6 +1391,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated runTest("compiler/fir/analysis-tests/testData/resolve/cfg/loops.kt"); } + @Test + @TestMetadata("nestedClass.kt") + public void testNestedClass() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.kt"); + } + @Test @TestMetadata("postponedLambdaInConstructor.kt") public void testPostponedLambdaInConstructor() throws Exception { diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTestGenerated.java index 3dff52d8c8d..21ae77b233f 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTestGenerated.java @@ -1199,6 +1199,11 @@ public class LazyBodyIsNotTouchedTestGenerated extends AbstractLazyBodyIsNotTouc runTest("compiler/fir/analysis-tests/testData/resolve/cfg/loops.kt"); } + @TestMetadata("nestedClass.kt") + public void testNestedClass() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.kt"); + } + @TestMetadata("postponedLambdaInConstructor.kt") public void testPostponedLambdaInConstructor() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot index 61e266364b3..62daf065950 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot @@ -8,14 +8,13 @@ digraph complex_kt { 0 [label="Enter class AutoCloseable" style="filled" fillcolor=red]; 1 [label="Exit class AutoCloseable" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function close" style="filled" fillcolor=red]; 3 [label="Exit function close" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.dot new file mode 100644 index 00000000000..21e879a2cc6 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.dot @@ -0,0 +1,106 @@ +digraph nestedClass_kt { + graph [nodesep=3] + node [shape=box penwidth=2] + edge [penwidth=2] + + subgraph cluster_0 { + color=red + 0 [label="Enter class OuterClass" style="filled" fillcolor=red]; + subgraph cluster_1 { + color=blue + 1 [label="Enter property" style="filled" fillcolor=red]; + 2 [label="Const: Int(1)"]; + 3 [label="Exit property" style="filled" fillcolor=red]; + } + subgraph cluster_2 { + color=blue + 4 [label="Enter property" style="filled" fillcolor=red]; + 5 [label="Access variable R|/OuterClass.outerProperty|"]; + 6 [label="Exit property" style="filled" fillcolor=red]; + } + subgraph cluster_3 { + color=blue + 7 [label="Enter function " style="filled" fillcolor=red]; + 8 [label="Delegated constructor call: super()" style="filled" fillcolor=yellow]; + 9 [label="Exit function " style="filled" fillcolor=red]; + } + 10 [label="Exit class OuterClass" style="filled" fillcolor=red]; + } + 0 -> {1} [color=green]; + 0 -> {10} [style=dotted]; + 0 -> {1 4 7} [style=dashed]; + 1 -> {2}; + 2 -> {3}; + 3 -> {4} [color=green]; + 4 -> {5}; + 5 -> {6}; + 6 -> {7} [color=green]; + 7 -> {8}; + 8 -> {9}; + 9 -> {10} [color=green]; + + subgraph cluster_4 { + color=red + 11 [label="Enter function outerFunction" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 12 [label="Enter block"]; + 13 [label="Exit block"]; + } + 14 [label="Exit function outerFunction" style="filled" fillcolor=red]; + } + 11 -> {12}; + 12 -> {13}; + 13 -> {14}; + + subgraph cluster_6 { + color=red + 15 [label="Enter class NestedClass" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 16 [label="Enter property" style="filled" fillcolor=red]; + 17 [label="Const: Int(1)"]; + 18 [label="Exit property" style="filled" fillcolor=red]; + } + subgraph cluster_8 { + color=blue + 19 [label="Enter property" style="filled" fillcolor=red]; + 20 [label="Access variable R|/OuterClass.NestedClass.nestedProperty|"]; + 21 [label="Exit property" style="filled" fillcolor=red]; + } + subgraph cluster_9 { + color=blue + 22 [label="Enter function " style="filled" fillcolor=red]; + 23 [label="Delegated constructor call: super()" style="filled" fillcolor=yellow]; + 24 [label="Exit function " style="filled" fillcolor=red]; + } + 25 [label="Exit class NestedClass" style="filled" fillcolor=red]; + } + 15 -> {16} [color=green]; + 15 -> {25} [style=dotted]; + 15 -> {16 19 22} [style=dashed]; + 16 -> {17}; + 17 -> {18}; + 18 -> {19} [color=green]; + 19 -> {20}; + 20 -> {21}; + 21 -> {22} [color=green]; + 22 -> {23}; + 23 -> {24}; + 24 -> {25} [color=green]; + + subgraph cluster_10 { + color=red + 26 [label="Enter function nestedFUnction" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 27 [label="Enter block"]; + 28 [label="Exit block"]; + } + 29 [label="Exit function nestedFUnction" style="filled" fillcolor=red]; + } + 26 -> {27}; + 27 -> {28}; + 28 -> {29}; + +} diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.fir.txt new file mode 100644 index 00000000000..1818b3c3722 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.fir.txt @@ -0,0 +1,32 @@ +FILE: nestedClass.kt + public final class OuterClass : R|kotlin/Any| { + public constructor(): R|OuterClass| { + super() + } + + public final fun outerFunction(): R|kotlin/Unit| { + } + + public final val outerProperty: R|kotlin/Int| = Int(1) + public get(): R|kotlin/Int| + + public final val outerProperty2: R|kotlin/Int| = this@R|/OuterClass|.R|/OuterClass.outerProperty| + public get(): R|kotlin/Int| + + public final class NestedClass : R|kotlin/Any| { + public constructor(): R|OuterClass.NestedClass| { + super() + } + + public final fun nestedFUnction(): R|kotlin/Unit| { + } + + public final val nestedProperty: R|kotlin/Int| = Int(1) + public get(): R|kotlin/Int| + + public final val nestedProperty2: R|kotlin/Int| = this@R|/OuterClass.NestedClass|.R|/OuterClass.NestedClass.nestedProperty| + public get(): R|kotlin/Int| + + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.kt b/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.kt new file mode 100644 index 00000000000..1592020f9fe --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.kt @@ -0,0 +1,12 @@ +// !DUMP_CFG +class OuterClass { + fun outerFunction() {} + val outerProperty = 1 + val outerProperty2 = outerProperty + + class NestedClass { + fun nestedFUnction() {} + val nestedProperty = 1 + val nestedProperty2 = nestedProperty + } +} \ No newline at end of file diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot index c1b53221e3b..648902e5294 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot @@ -64,17 +64,6 @@ digraph postponedLambdaInConstructor_kt { } 26 [label="Exit class B" style="filled" fillcolor=red]; } - subgraph cluster_9 { - color=blue - 27 [label="Enter function foo" style="filled" fillcolor=red]; - subgraph cluster_10 { - color=blue - 28 [label="Enter block"]; - 29 [label="Function call: this@R|/B|.R|/B.foo|()" style="filled" fillcolor=yellow]; - 30 [label="Exit block"]; - } - 31 [label="Exit function foo" style="filled" fillcolor=red]; - } 5 -> {6} [color=green]; 5 -> {26} [style=dotted]; 5 -> {6 9} [style=dashed]; @@ -101,8 +90,18 @@ digraph postponedLambdaInConstructor_kt { 23 -> {24}; 24 -> {25}; 25 -> {26} [color=green]; - 26 -> {27} [color=green]; - 26 -> {27} [style=dashed]; + + subgraph cluster_9 { + color=red + 27 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_10 { + color=blue + 28 [label="Enter block"]; + 29 [label="Function call: this@R|/B|.R|/B.foo|()" style="filled" fillcolor=yellow]; + 30 [label="Exit block"]; + } + 31 [label="Exit function foo" style="filled" fillcolor=red]; + } 27 -> {28}; 28 -> {29}; 29 -> {30}; diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot index 470d147f5b3..40f9499aa25 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot @@ -8,20 +8,20 @@ digraph safeCalls_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } - subgraph cluster_1 { - color=blue - 2 [label="Enter function bar" style="filled" fillcolor=red]; - 3 [label="Exit function bar" style="filled" fillcolor=red]; - } - subgraph cluster_2 { - color=blue - 4 [label="Enter function foo" style="filled" fillcolor=red]; - 5 [label="Exit function foo" style="filled" fillcolor=red]; - } 0 -> {1} [color=green]; - 1 -> {2 4} [color=green]; - 1 -> {2 4} [style=dashed]; + + subgraph cluster_1 { + color=red + 2 [label="Enter function foo" style="filled" fillcolor=red]; + 3 [label="Exit function foo" style="filled" fillcolor=red]; + } 2 -> {3}; + + subgraph cluster_2 { + color=red + 4 [label="Enter function bar" style="filled" fillcolor=red]; + 5 [label="Exit function bar" style="filled" fillcolor=red]; + } 4 -> {5}; subgraph cluster_3 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot index caa1bf1bb1e..189f4e2f1cc 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot @@ -8,14 +8,13 @@ digraph bangbang_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot index 33c32e2fea5..6e393571da5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot @@ -8,20 +8,20 @@ digraph booleanOperators_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } - subgraph cluster_1 { - color=blue - 2 [label="Enter function bool" style="filled" fillcolor=red]; - 3 [label="Exit function bool" style="filled" fillcolor=red]; - } - subgraph cluster_2 { - color=blue - 4 [label="Enter function foo" style="filled" fillcolor=red]; - 5 [label="Exit function foo" style="filled" fillcolor=red]; - } 0 -> {1} [color=green]; - 1 -> {2 4} [color=green]; - 1 -> {2 4} [style=dashed]; + + subgraph cluster_1 { + color=red + 2 [label="Enter function foo" style="filled" fillcolor=red]; + 3 [label="Exit function foo" style="filled" fillcolor=red]; + } 2 -> {3}; + + subgraph cluster_2 { + color=red + 4 [label="Enter function bool" style="filled" fillcolor=red]; + 5 [label="Exit function bool" style="filled" fillcolor=red]; + } 4 -> {5}; subgraph cluster_3 { @@ -29,14 +29,13 @@ digraph booleanOperators_kt { 6 [label="Enter class B" style="filled" fillcolor=red]; 7 [label="Exit class B" style="filled" fillcolor=red]; } + 6 -> {7} [color=green]; + subgraph cluster_4 { - color=blue + color=red 8 [label="Enter function bar" style="filled" fillcolor=red]; 9 [label="Exit function bar" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; - 7 -> {8} [color=green]; - 7 -> {8} [style=dashed]; 8 -> {9}; subgraph cluster_5 { @@ -44,14 +43,13 @@ digraph booleanOperators_kt { 10 [label="Enter class C" style="filled" fillcolor=red]; 11 [label="Exit class C" style="filled" fillcolor=red]; } + 10 -> {11} [color=green]; + subgraph cluster_6 { - color=blue + color=red 12 [label="Enter function baz" style="filled" fillcolor=red]; 13 [label="Exit function baz" style="filled" fillcolor=red]; } - 10 -> {11} [color=green]; - 11 -> {12} [color=green]; - 11 -> {12} [style=dashed]; 12 -> {13}; subgraph cluster_7 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot index b18df24ac9b..85e40e5ed08 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot @@ -8,14 +8,13 @@ digraph equalsToBoolean_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot index 4be05fbf9c2..2f1dcb0480a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot @@ -8,14 +8,13 @@ digraph jumpFromRhsOfOperator_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot index 344f489beb8..5ce43db334c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot @@ -8,14 +8,13 @@ digraph boundSmartcasts_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { @@ -23,14 +22,13 @@ digraph boundSmartcasts_kt { 4 [label="Enter class B" style="filled" fillcolor=red]; 5 [label="Exit class B" style="filled" fillcolor=red]; } + 4 -> {5} [color=green]; + subgraph cluster_3 { - color=blue + color=red 6 [label="Enter function bar" style="filled" fillcolor=red]; 7 [label="Exit function bar" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; - 5 -> {6} [color=green]; - 5 -> {6} [style=dashed]; 6 -> {7}; subgraph cluster_4 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot index f3b467ae095..c67b182620e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot @@ -8,14 +8,13 @@ digraph elvis_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot index bc823db480d..984bd46efce 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot @@ -157,14 +157,13 @@ digraph returns_kt { 53 [label="Enter class A" style="filled" fillcolor=red]; 54 [label="Exit class A" style="filled" fillcolor=red]; } + 53 -> {54} [color=green]; + subgraph cluster_15 { - color=blue + color=red 55 [label="Enter function foo" style="filled" fillcolor=red]; 56 [label="Exit function foo" style="filled" fillcolor=red]; } - 53 -> {54} [color=green]; - 54 -> {55} [color=green]; - 54 -> {55} [style=dashed]; 55 -> {56}; subgraph cluster_16 { @@ -172,14 +171,13 @@ digraph returns_kt { 57 [label="Enter class B" style="filled" fillcolor=red]; 58 [label="Exit class B" style="filled" fillcolor=red]; } + 57 -> {58} [color=green]; + subgraph cluster_17 { - color=blue + color=red 59 [label="Enter function bar" style="filled" fillcolor=red]; 60 [label="Exit function bar" style="filled" fillcolor=red]; } - 57 -> {58} [color=green]; - 58 -> {59} [color=green]; - 58 -> {59} [style=dashed]; 59 -> {60}; subgraph cluster_18 { @@ -187,14 +185,13 @@ digraph returns_kt { 61 [label="Enter class C" style="filled" fillcolor=red]; 62 [label="Exit class C" style="filled" fillcolor=red]; } + 61 -> {62} [color=green]; + subgraph cluster_19 { - color=blue + color=red 63 [label="Enter function baz" style="filled" fillcolor=red]; 64 [label="Exit function baz" style="filled" fillcolor=red]; } - 61 -> {62} [color=green]; - 62 -> {63} [color=green]; - 62 -> {63} [style=dashed]; 63 -> {64}; subgraph cluster_20 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot index 36b2001d37e..ebbfa54eb7f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot @@ -8,14 +8,13 @@ digraph smartcastFromArgument_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot index eca6029621f..5d045fcd045 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot @@ -8,14 +8,13 @@ digraph when_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { @@ -23,14 +22,13 @@ digraph when_kt { 4 [label="Enter class B" style="filled" fillcolor=red]; 5 [label="Exit class B" style="filled" fillcolor=red]; } + 4 -> {5} [color=green]; + subgraph cluster_3 { - color=blue + color=red 6 [label="Enter function bar" style="filled" fillcolor=red]; 7 [label="Exit function bar" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; - 5 -> {6} [color=green]; - 5 -> {6} [style=dashed]; 6 -> {7}; subgraph cluster_4 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot index 33a9c1f60db..ef7e82df050 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot @@ -8,14 +8,13 @@ digraph equalsAndIdentity_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot index 47441f0fa56..2e7960b73ef 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot @@ -8,14 +8,13 @@ digraph inPlaceLambdas_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { @@ -23,14 +22,13 @@ digraph inPlaceLambdas_kt { 4 [label="Enter class B" style="filled" fillcolor=red]; 5 [label="Exit class B" style="filled" fillcolor=red]; } + 4 -> {5} [color=green]; + subgraph cluster_3 { - color=blue + color=red 6 [label="Enter function bar" style="filled" fillcolor=red]; 7 [label="Exit function bar" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; - 5 -> {6} [color=green]; - 5 -> {6} [style=dashed]; 6 -> {7}; subgraph cluster_4 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.dot index 062d8c0fb19..debcdd888e2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.dot @@ -38,24 +38,6 @@ digraph lambdaInWhenBranch_kt { } 12 [label="Exit class SubClass1" style="filled" fillcolor=red]; } - subgraph cluster_5 { - color=blue - 13 [label="Enter function copy" style="filled" fillcolor=red]; - 14 [label="Enter default value of t"]; - subgraph cluster_6 { - color=blue - 15 [label="Enter default value of t" style="filled" fillcolor=red]; - 16 [label="Access variable R|/SubClass1.t|"]; - 17 [label="Exit default value of t" style="filled" fillcolor=red]; - } - 18 [label="Exit default value of t"]; - 19 [label="Exit function copy" style="filled" fillcolor=red]; - } - subgraph cluster_7 { - color=blue - 20 [label="Enter function component1" style="filled" fillcolor=red]; - 21 [label="Exit function component1" style="filled" fillcolor=red]; - } 5 -> {6} [color=green]; 5 -> {12} [style=dotted]; 5 -> {6 9} [style=dashed]; @@ -65,15 +47,33 @@ digraph lambdaInWhenBranch_kt { 9 -> {10}; 10 -> {11}; 11 -> {12} [color=green]; - 12 -> {13 20} [color=green]; - 12 -> {13 20} [style=dashed]; + + subgraph cluster_5 { + color=red + 13 [label="Enter function component1" style="filled" fillcolor=red]; + 14 [label="Exit function component1" style="filled" fillcolor=red]; + } 13 -> {14}; - 14 -> {15 18}; - 14 -> {15} [style=dashed]; + + subgraph cluster_6 { + color=red + 15 [label="Enter function copy" style="filled" fillcolor=red]; + 16 [label="Enter default value of t"]; + subgraph cluster_7 { + color=blue + 17 [label="Enter default value of t" style="filled" fillcolor=red]; + 18 [label="Access variable R|/SubClass1.t|"]; + 19 [label="Exit default value of t" style="filled" fillcolor=red]; + } + 20 [label="Exit default value of t"]; + 21 [label="Exit function copy" style="filled" fillcolor=red]; + } 15 -> {16}; - 16 -> {17}; + 16 -> {17 20}; + 16 -> {17} [style=dashed]; 17 -> {18}; 18 -> {19}; + 19 -> {20}; 20 -> {21}; subgraph cluster_8 { @@ -87,19 +87,18 @@ digraph lambdaInWhenBranch_kt { } 26 [label="Exit class SubClass2" style="filled" fillcolor=red]; } - subgraph cluster_10 { - color=blue - 27 [label="Enter function copy" style="filled" fillcolor=red]; - 28 [label="Exit function copy" style="filled" fillcolor=red]; - } 22 -> {23} [color=green]; 22 -> {26} [style=dotted]; 22 -> {23} [style=dashed]; 23 -> {24}; 24 -> {25}; 25 -> {26} [color=green]; - 26 -> {27} [color=green]; - 26 -> {27} [style=dashed]; + + subgraph cluster_10 { + color=red + 27 [label="Enter function copy" style="filled" fillcolor=red]; + 28 [label="Exit function copy" style="filled" fillcolor=red]; + } 27 -> {28}; subgraph cluster_11 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot index ce2b60c386a..f25606a40a8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot @@ -8,14 +8,13 @@ digraph dataFlowInfoFromWhileCondition_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot index fae481577e8..c1634ba453c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot @@ -8,14 +8,13 @@ digraph endlessLoops_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot index 4d902307352..e032dc261d0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot @@ -8,14 +8,13 @@ digraph multipleCasts_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + subgraph cluster_1 { - color=blue + color=red 2 [label="Enter function foo" style="filled" fillcolor=red]; 3 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 1 -> {2} [color=green]; - 1 -> {2} [style=dashed]; 2 -> {3}; subgraph cluster_2 { @@ -23,14 +22,13 @@ digraph multipleCasts_kt { 4 [label="Enter class B" style="filled" fillcolor=red]; 5 [label="Exit class B" style="filled" fillcolor=red]; } + 4 -> {5} [color=green]; + subgraph cluster_3 { - color=blue + color=red 6 [label="Enter function foo" style="filled" fillcolor=red]; 7 [label="Exit function foo" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; - 5 -> {6} [color=green]; - 5 -> {6} [style=dashed]; 6 -> {7}; subgraph cluster_4 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot index 682568b73e0..9a8eaa390c9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot @@ -8,20 +8,20 @@ digraph nullability_kt { 0 [label="Enter class A" style="filled" fillcolor=red]; 1 [label="Exit class A" style="filled" fillcolor=red]; } - subgraph cluster_1 { - color=blue - 2 [label="Enter function getA" style="filled" fillcolor=red]; - 3 [label="Exit function getA" style="filled" fillcolor=red]; - } - subgraph cluster_2 { - color=blue - 4 [label="Enter function foo" style="filled" fillcolor=red]; - 5 [label="Exit function foo" style="filled" fillcolor=red]; - } 0 -> {1} [color=green]; - 1 -> {2 4} [color=green]; - 1 -> {2 4} [style=dashed]; + + subgraph cluster_1 { + color=red + 2 [label="Enter function foo" style="filled" fillcolor=red]; + 3 [label="Exit function foo" style="filled" fillcolor=red]; + } 2 -> {3}; + + subgraph cluster_2 { + color=red + 4 [label="Enter function getA" style="filled" fillcolor=red]; + 5 [label="Exit function getA" style="filled" fillcolor=red]; + } 4 -> {5}; subgraph cluster_3 { @@ -29,14 +29,13 @@ digraph nullability_kt { 6 [label="Enter class MyData" style="filled" fillcolor=red]; 7 [label="Exit class MyData" style="filled" fillcolor=red]; } + 6 -> {7} [color=green]; + subgraph cluster_4 { - color=blue + color=red 8 [label="Enter function fs" style="filled" fillcolor=red]; 9 [label="Exit function fs" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; - 7 -> {8} [color=green]; - 7 -> {8} [style=dashed]; 8 -> {9}; subgraph cluster_5 { @@ -44,14 +43,13 @@ digraph nullability_kt { 10 [label="Enter class Q" style="filled" fillcolor=red]; 11 [label="Exit class Q" style="filled" fillcolor=red]; } + 10 -> {11} [color=green]; + subgraph cluster_6 { - color=blue + color=red 12 [label="Enter function fdata" style="filled" fillcolor=red]; 13 [label="Exit function fdata" style="filled" fillcolor=red]; } - 10 -> {11} [color=green]; - 11 -> {12} [color=green]; - 11 -> {12} [style=dashed]; 12 -> {13}; subgraph cluster_7 { @@ -71,8 +69,18 @@ digraph nullability_kt { } 21 [label="Exit class QImpl" style="filled" fillcolor=red]; } + 14 -> {15} [color=green]; + 14 -> {21} [style=dotted]; + 14 -> {15 18} [style=dashed]; + 15 -> {16}; + 16 -> {17}; + 17 -> {18} [color=green]; + 18 -> {19}; + 19 -> {20}; + 20 -> {21} [color=green]; + subgraph cluster_10 { - color=blue + color=red 22 [label="Enter function fdata" style="filled" fillcolor=red]; subgraph cluster_11 { color=blue @@ -84,17 +92,6 @@ digraph nullability_kt { } 28 [label="Exit function fdata" style="filled" fillcolor=red]; } - 14 -> {15} [color=green]; - 14 -> {21} [style=dotted]; - 14 -> {15 18} [style=dashed]; - 15 -> {16}; - 16 -> {17}; - 17 -> {18} [color=green]; - 18 -> {19}; - 19 -> {20}; - 20 -> {21} [color=green]; - 21 -> {22} [color=green]; - 21 -> {22} [style=dashed]; 22 -> {23}; 23 -> {24}; 24 -> {25}; @@ -120,8 +117,18 @@ digraph nullability_kt { } 36 [label="Exit class QImplMutable" style="filled" fillcolor=red]; } + 29 -> {30} [color=green]; + 29 -> {36} [style=dotted]; + 29 -> {30 33} [style=dashed]; + 30 -> {31}; + 31 -> {32}; + 32 -> {33} [color=green]; + 33 -> {34}; + 34 -> {35}; + 35 -> {36} [color=green]; + subgraph cluster_15 { - color=blue + color=red 37 [label="Enter function fdata" style="filled" fillcolor=red]; subgraph cluster_16 { color=blue @@ -133,17 +140,6 @@ digraph nullability_kt { } 43 [label="Exit function fdata" style="filled" fillcolor=red]; } - 29 -> {30} [color=green]; - 29 -> {36} [style=dotted]; - 29 -> {30 33} [style=dashed]; - 30 -> {31}; - 31 -> {32}; - 32 -> {33} [color=green]; - 33 -> {34}; - 34 -> {35}; - 35 -> {36} [color=green]; - 36 -> {37} [color=green]; - 36 -> {37} [style=dashed]; 37 -> {38}; 38 -> {39}; 39 -> {40}; @@ -163,40 +159,26 @@ digraph nullability_kt { } 48 [label="Exit class QImplWithCustomGetter" style="filled" fillcolor=red]; } - subgraph cluster_19 { - color=blue - 49 [label="Enter function fdata" style="filled" fillcolor=red]; - subgraph cluster_20 { - color=blue - 50 [label="Enter block"]; - 51 [label="Const: Null(null)"]; - 52 [label="Jump: ^fdata Null(null)"]; - 53 [label="Stub" style="filled" fillcolor=gray]; - 54 [label="Exit block" style="filled" fillcolor=gray]; - } - 55 [label="Exit function fdata" style="filled" fillcolor=red]; - } - subgraph cluster_21 { - color=blue - 56 [label="Enter function " style="filled" fillcolor=red]; - subgraph cluster_22 { - color=blue - 57 [label="Enter block"]; - 58 [label="Const: Null(null)"]; - 59 [label="Jump: ^ Null(null)"]; - 60 [label="Stub" style="filled" fillcolor=gray]; - 61 [label="Exit block" style="filled" fillcolor=gray]; - } - 62 [label="Exit function " style="filled" fillcolor=red]; - } 44 -> {45} [color=green]; 44 -> {48} [style=dotted]; 44 -> {45} [style=dashed]; 45 -> {46}; 46 -> {47}; 47 -> {48} [color=green]; - 48 -> {49 56} [color=green]; - 48 -> {49 56} [style=dashed]; + + subgraph cluster_19 { + color=red + 49 [label="Enter function " style="filled" fillcolor=red]; + subgraph cluster_20 { + 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 " style="filled" fillcolor=red]; + } 49 -> {50}; 50 -> {51}; 51 -> {52}; @@ -204,6 +186,20 @@ digraph nullability_kt { 52 -> {53} [style=dotted]; 53 -> {54} [style=dotted]; 54 -> {55} [style=dotted]; + + subgraph cluster_21 { + color=red + 56 [label="Enter function fdata" style="filled" fillcolor=red]; + subgraph cluster_22 { + color=blue + 57 [label="Enter block"]; + 58 [label="Const: Null(null)"]; + 59 [label="Jump: ^fdata Null(null)"]; + 60 [label="Stub" style="filled" fillcolor=gray]; + 61 [label="Exit block" style="filled" fillcolor=gray]; + } + 62 [label="Exit function fdata" style="filled" fillcolor=red]; + } 56 -> {57}; 57 -> {58}; 58 -> {59}; diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot index f1df69a831d..20438c65feb 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot @@ -14,8 +14,15 @@ digraph implicitReceivers_kt { } 4 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + 0 -> {4} [style=dotted]; + 0 -> {1} [style=dashed]; + 1 -> {2}; + 2 -> {3}; + 3 -> {4} [color=green]; + subgraph cluster_2 { - color=blue + color=red 5 [label="Enter function foo" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue @@ -24,14 +31,6 @@ digraph implicitReceivers_kt { } 8 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 0 -> {4} [style=dotted]; - 0 -> {1} [style=dashed]; - 1 -> {2}; - 2 -> {3}; - 3 -> {4} [color=green]; - 4 -> {5} [color=green]; - 4 -> {5} [style=dashed]; 5 -> {6}; 6 -> {7}; 7 -> {8}; @@ -47,8 +46,15 @@ digraph implicitReceivers_kt { } 13 [label="Exit class B" style="filled" fillcolor=red]; } + 9 -> {10} [color=green]; + 9 -> {13} [style=dotted]; + 9 -> {10} [style=dashed]; + 10 -> {11}; + 11 -> {12}; + 12 -> {13} [color=green]; + subgraph cluster_6 { - color=blue + color=red 14 [label="Enter function bar" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue @@ -57,14 +63,6 @@ digraph implicitReceivers_kt { } 17 [label="Exit function bar" style="filled" fillcolor=red]; } - 9 -> {10} [color=green]; - 9 -> {13} [style=dotted]; - 9 -> {10} [style=dashed]; - 10 -> {11}; - 11 -> {12}; - 12 -> {13} [color=green]; - 13 -> {14} [color=green]; - 13 -> {14} [style=dashed]; 14 -> {15}; 15 -> {16}; 16 -> {17}; diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot index 24d43bd8a5c..684dd0b9da6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot @@ -20,29 +20,6 @@ digraph assignSafeCall_kt { } 7 [label="Exit class A" style="filled" fillcolor=red]; } - subgraph cluster_3 { - color=blue - 8 [label="Enter function bar" style="filled" fillcolor=red]; - subgraph cluster_4 { - color=blue - 9 [label="Enter block"]; - 10 [label="Exit block"]; - } - 11 [label="Exit function bar" style="filled" fillcolor=red]; - } - subgraph cluster_5 { - color=blue - 12 [label="Enter function foo" style="filled" fillcolor=red]; - subgraph cluster_6 { - color=blue - 13 [label="Enter block"]; - 14 [label="Const: Int(1)"]; - 15 [label="Jump: ^foo Int(1)"]; - 16 [label="Stub" style="filled" fillcolor=gray]; - 17 [label="Exit block" style="filled" fillcolor=gray]; - } - 18 [label="Exit function foo" style="filled" fillcolor=red]; - } 0 -> {1} [color=green]; 0 -> {7} [style=dotted]; 0 -> {1 4} [style=dashed]; @@ -52,18 +29,41 @@ digraph assignSafeCall_kt { 4 -> {5}; 5 -> {6}; 6 -> {7} [color=green]; - 7 -> {8 12} [color=green]; - 7 -> {8 12} [style=dashed]; + + subgraph cluster_3 { + color=red + 8 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_4 { + color=blue + 9 [label="Enter block"]; + 10 [label="Const: Int(1)"]; + 11 [label="Jump: ^foo Int(1)"]; + 12 [label="Stub" style="filled" fillcolor=gray]; + 13 [label="Exit block" style="filled" fillcolor=gray]; + } + 14 [label="Exit function foo" style="filled" fillcolor=red]; + } 8 -> {9}; 9 -> {10}; 10 -> {11}; - 12 -> {13}; - 13 -> {14}; - 14 -> {15}; - 15 -> {18}; - 15 -> {16} [style=dotted]; - 16 -> {17} [style=dotted]; - 17 -> {18} [style=dotted]; + 11 -> {14}; + 11 -> {12} [style=dotted]; + 12 -> {13} [style=dotted]; + 13 -> {14} [style=dotted]; + + subgraph cluster_5 { + color=red + 15 [label="Enter function bar" style="filled" fillcolor=red]; + subgraph cluster_6 { + color=blue + 16 [label="Enter block"]; + 17 [label="Exit block"]; + } + 18 [label="Exit function bar" style="filled" fillcolor=red]; + } + 15 -> {16}; + 16 -> {17}; + 17 -> {18}; subgraph cluster_7 { color=red @@ -239,20 +239,20 @@ digraph assignSafeCall_kt { 85 [label="Enter class B" style="filled" fillcolor=red]; 86 [label="Exit class B" style="filled" fillcolor=red]; } - subgraph cluster_20 { - color=blue - 87 [label="Enter function bar" style="filled" fillcolor=red]; - 88 [label="Exit function bar" style="filled" fillcolor=red]; - } - subgraph cluster_21 { - color=blue - 89 [label="Enter function foo" style="filled" fillcolor=red]; - 90 [label="Exit function foo" style="filled" fillcolor=red]; - } 85 -> {86} [color=green]; - 86 -> {87 89} [color=green]; - 86 -> {87 89} [style=dashed]; + + subgraph cluster_20 { + color=red + 87 [label="Enter function foo" style="filled" fillcolor=red]; + 88 [label="Exit function foo" style="filled" fillcolor=red]; + } 87 -> {88}; + + subgraph cluster_21 { + color=red + 89 [label="Enter function bar" style="filled" fillcolor=red]; + 90 [label="Exit function bar" style="filled" fillcolor=red]; + } 89 -> {90}; subgraph cluster_22 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot index 63af2355045..3da3febc58b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot @@ -79,26 +79,27 @@ digraph safeCalls_kt { 26 [label="Enter class A" style="filled" fillcolor=red]; 27 [label="Exit class A" style="filled" fillcolor=red]; } + 26 -> {27} [color=green]; + subgraph cluster_7 { - color=blue - 28 [label="Enter function id" style="filled" fillcolor=red]; - 29 [label="Exit function id" style="filled" fillcolor=red]; + color=red + 28 [label="Enter function bar" style="filled" fillcolor=red]; + 29 [label="Exit function bar" style="filled" fillcolor=red]; } + 28 -> {29}; + subgraph cluster_8 { - color=blue + color=red 30 [label="Enter function bool" style="filled" fillcolor=red]; 31 [label="Exit function bool" style="filled" fillcolor=red]; } - subgraph cluster_9 { - color=blue - 32 [label="Enter function bar" style="filled" fillcolor=red]; - 33 [label="Exit function bar" style="filled" fillcolor=red]; - } - 26 -> {27} [color=green]; - 27 -> {28 30 32} [color=green]; - 27 -> {28 30 32} [style=dashed]; - 28 -> {29}; 30 -> {31}; + + subgraph cluster_9 { + color=red + 32 [label="Enter function id" style="filled" fillcolor=red]; + 33 [label="Exit function id" style="filled" fillcolor=red]; + } 32 -> {33}; subgraph cluster_10 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot index 09da23f6bec..15bbdccb095 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot @@ -15,14 +15,13 @@ digraph smartCastInInit_kt { 2 [label="Enter class S" style="filled" fillcolor=red]; 3 [label="Exit class S" style="filled" fillcolor=red]; } + 2 -> {3} [color=green]; + subgraph cluster_2 { - color=blue + color=red 4 [label="Enter function foo" style="filled" fillcolor=red]; 5 [label="Exit function foo" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; - 3 -> {4} [color=green]; - 3 -> {4} [style=dashed]; 4 -> {5}; subgraph cluster_3 { diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot index 5635e018f98..ef4e633ef37 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot @@ -42,8 +42,16 @@ digraph overridenOpenVal_kt { } 13 [label="Exit class B" style="filled" fillcolor=red]; } + 8 -> {9} [color=green]; + 8 -> {13} [style=dotted]; + 8 -> {9} [style=dashed]; + 9 -> {10}; + 10 -> {11}; + 11 -> {12}; + 12 -> {13} [color=green]; + subgraph cluster_5 { - color=blue + color=red 14 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue @@ -75,15 +83,6 @@ digraph overridenOpenVal_kt { } 31 [label="Exit function test_1" style="filled" fillcolor=red]; } - 8 -> {9} [color=green]; - 8 -> {13} [style=dotted]; - 8 -> {9} [style=dashed]; - 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {13} [color=green]; - 13 -> {14} [color=green]; - 13 -> {14} [style=dashed]; 14 -> {15}; 15 -> {16}; 16 -> {17}; diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot index 0321b928282..53254000e56 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot @@ -14,8 +14,15 @@ digraph delayedAssignment_kt { } 4 [label="Exit class A" style="filled" fillcolor=red]; } + 0 -> {1} [color=green]; + 0 -> {4} [style=dotted]; + 0 -> {1} [style=dashed]; + 1 -> {2}; + 2 -> {3}; + 3 -> {4} [color=green]; + subgraph cluster_2 { - color=blue + color=red 5 [label="Enter function foo" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue @@ -24,14 +31,6 @@ digraph delayedAssignment_kt { } 8 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; - 0 -> {4} [style=dotted]; - 0 -> {1} [style=dashed]; - 1 -> {2}; - 2 -> {3}; - 3 -> {4} [color=green]; - 4 -> {5} [color=green]; - 4 -> {5} [style=dashed]; 5 -> {6}; 6 -> {7}; 7 -> {8}; diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot index 8a2a64ccdc0..66099894c8b 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot @@ -56,8 +56,15 @@ digraph delegateWithAnonymousObject_kt { } 18 [label="Exit class IssueListView" style="filled" fillcolor=red]; } + 14 -> {15} [color=green]; + 14 -> {18} [style=dotted]; + 14 -> {15} [style=dashed]; + 15 -> {16}; + 16 -> {17}; + 17 -> {18} [color=green]; + subgraph cluster_6 { - color=blue + color=red 19 [label="Enter function updateFrom" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue @@ -66,14 +73,6 @@ digraph delegateWithAnonymousObject_kt { } 22 [label="Exit function updateFrom" style="filled" fillcolor=red]; } - 14 -> {15} [color=green]; - 14 -> {18} [style=dotted]; - 14 -> {15} [style=dashed]; - 15 -> {16}; - 16 -> {17}; - 17 -> {18} [color=green]; - 18 -> {19} [color=green]; - 18 -> {19} [style=dashed]; 19 -> {20}; 20 -> {21}; 21 -> {22}; @@ -150,33 +149,6 @@ digraph delegateWithAnonymousObject_kt { } 61 [label="Exit class IssuesListUserProfile" style="filled" fillcolor=red]; } - subgraph cluster_19 { - color=blue - 62 [label="Enter function " style="filled" fillcolor=red]; - subgraph cluster_20 { - color=blue - 63 [label="Enter block"]; - 64 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 65 [label="Access variable R|/issueListView|"]; - 66 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; - 67 [label="Exit block"]; - } - 68 [label="Exit function " style="filled" fillcolor=red]; - } - subgraph cluster_21 { - color=blue - 69 [label="Enter function " style="filled" fillcolor=red]; - subgraph cluster_22 { - color=blue - 70 [label="Enter block"]; - 71 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 72 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; - 73 [label="Jump: ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; - 74 [label="Stub" style="filled" fillcolor=gray]; - 75 [label="Exit block" style="filled" fillcolor=gray]; - } - 76 [label="Exit function " style="filled" fillcolor=red]; - } 23 -> {24} [color=green]; 23 -> {61} [style=dotted]; 23 -> {24 58} [style=dashed]; @@ -225,21 +197,48 @@ digraph delegateWithAnonymousObject_kt { 58 -> {59}; 59 -> {60}; 60 -> {61} [color=green]; - 61 -> {62 69} [color=green]; - 61 -> {62 69} [style=dashed]; + + subgraph cluster_19 { + color=red + 62 [label="Enter function " style="filled" fillcolor=red]; + subgraph cluster_20 { + color=blue + 63 [label="Enter block"]; + 64 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; + 65 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; + 66 [label="Jump: ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; + 67 [label="Stub" style="filled" fillcolor=gray]; + 68 [label="Exit block" style="filled" fillcolor=gray]; + } + 69 [label="Exit function " style="filled" fillcolor=red]; + } 62 -> {63}; 63 -> {64}; 64 -> {65}; 65 -> {66}; - 66 -> {67}; - 67 -> {68}; - 69 -> {70}; + 66 -> {69}; + 66 -> {67} [style=dotted]; + 67 -> {68} [style=dotted]; + 68 -> {69} [style=dotted]; + + subgraph cluster_21 { + color=red + 70 [label="Enter function " style="filled" fillcolor=red]; + subgraph cluster_22 { + color=blue + 71 [label="Enter block"]; + 72 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; + 73 [label="Access variable R|/issueListView|"]; + 74 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; + 75 [label="Exit block"]; + } + 76 [label="Exit function " style="filled" fillcolor=red]; + } 70 -> {71}; 71 -> {72}; 72 -> {73}; - 73 -> {76}; - 73 -> {74} [style=dotted]; - 74 -> {75} [style=dotted]; - 75 -> {76} [style=dotted]; + 73 -> {74}; + 74 -> {75}; + 75 -> {76}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/initialization/fromLocalMembers.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/initialization/fromLocalMembers.fir.txt index d31bec2a3f0..791164baca9 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/initialization/fromLocalMembers.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/initialization/fromLocalMembers.fir.txt @@ -10,6 +10,7 @@ FILE: fromLocalMembers.kt public final fun test2(): R|kotlin/Unit| { lval x: R|kotlin/Int| lval y: R|kotlin/Int| + lval z: R|kotlin/Int| object : R|kotlin/Any| { private constructor(): R|| { super() @@ -23,6 +24,12 @@ FILE: fromLocalMembers.kt R|/y| = Int(0) } + public final val prop: R|kotlin/Int| + public get(): R|kotlin/Int| { + R|/z| = Int(0) + ^ Int(2) + } + } R|kotlin/io/println|(R|/x|) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/initialization/fromLocalMembers.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/initialization/fromLocalMembers.kt index 50e38af319c..cc31ee1a427 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/initialization/fromLocalMembers.kt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/initialization/fromLocalMembers.kt @@ -12,6 +12,7 @@ fun test1() { fun test2() { val x: Int val y: Int + val z: Int object { init { @@ -21,6 +22,12 @@ fun test2() { fun localFunc() { y = 0 } + + val prop: Int + get() { + z = 0 + return 2 + } } println(x) diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java index 0a4cccd1199..723ac4186e6 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java @@ -1391,6 +1391,12 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi runTest("compiler/fir/analysis-tests/testData/resolve/cfg/loops.kt"); } + @Test + @TestMetadata("nestedClass.kt") + public void testNestedClass() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.kt"); + } + @Test @TestMetadata("postponedLambdaInConstructor.kt") public void testPostponedLambdaInConstructor() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java index d364a732d4a..c52426fd0fb 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java @@ -1391,6 +1391,12 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest runTest("compiler/fir/analysis-tests/testData/resolve/cfg/loops.kt"); } + @Test + @TestMetadata("nestedClass.kt") + public void testNestedClass() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/cfg/nestedClass.kt"); + } + @Test @TestMetadata("postponedLambdaInConstructor.kt") public void testPostponedLambdaInConstructor() throws Exception { 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 332f1366739..f72c99139e9 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 @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -369,21 +369,15 @@ class ControlFlowGraphBuilder { // ----------------------------------- Classes ----------------------------------- - private val FirControlFlowGraphOwner.memberShouldHaveGraph: Boolean - get() = when (this) { - is FirProperty -> initializer != null || delegate != null || hasExplicitBackingField - is FirField -> initializer != null - else -> true - } - private fun FirClass.firstInPlaceInitializedMember(): FirDeclaration? = - declarations.find { it is FirControlFlowGraphOwner && it !is FirFunction && it !is FirClass && it.memberShouldHaveGraph } + declarations.find { it is FirControlFlowGraphOwner && it !is FirConstructor && it.isUsedInControlFlowGraphBuilderForClass } private inline fun FirClass.forEachGraphOwner(block: (FirControlFlowGraphOwner) -> Unit) { for (member in declarations) { if (member is FirControlFlowGraphOwner && member.memberShouldHaveGraph) { block(member) } + if (member is FirProperty) { member.getter?.let { block(it) } member.setter?.let { block(it) } @@ -458,6 +452,7 @@ class ControlFlowGraphBuilder { return null to null } + val isLocalClass = klass.isLocal val calledInPlace = mutableListOf() val calledLater = mutableListOf() val constructors = mutableMapOf() @@ -465,7 +460,10 @@ class ControlFlowGraphBuilder { val graph = it.controlFlowGraphReference?.controlFlowGraph ?: return@forEachGraphOwner when (it) { is FirConstructor -> constructors[it] = graph - is FirFunction, is FirClass -> calledLater.add(graph) + is FirPropertyAccessor, is FirFunction, is FirClass -> if (isLocalClass) { + calledLater.add(graph) + } + else -> calledInPlace.add(graph) } } @@ -1354,3 +1352,21 @@ class ControlFlowGraphBuilder { } fun FirDeclaration?.isLocalClassOrAnonymousObject() = ((this as? FirRegularClass)?.isLocal == true) || this is FirAnonymousObject + +private val FirControlFlowGraphOwner.memberShouldHaveGraph: Boolean + get() = when (this) { + is FirProperty -> initializer != null || delegate != null || hasExplicitBackingField + is FirField -> initializer != null + else -> true + } + +/** + * @return true for [FirControlFlowGraphOwner] which, as a class member, should be part of the class + */ +val FirControlFlowGraphOwner.isUsedInControlFlowGraphBuilderForClass: Boolean + get() = when (this) { + is FirProperty, is FirField -> memberShouldHaveGraph + is FirConstructor, is FirAnonymousInitializer -> true + is FirFunction, is FirClass -> false + else -> true + } diff --git a/compiler/testData/codegen/box/smartCasts/kt44814.dot b/compiler/testData/codegen/box/smartCasts/kt44814.dot index d6986ac859d..498b25f957a 100644 --- a/compiler/testData/codegen/box/smartCasts/kt44814.dot +++ b/compiler/testData/codegen/box/smartCasts/kt44814.dot @@ -188,19 +188,6 @@ digraph kt44814_kt { } 61 [label="Exit class LighterASTNode [1]" style="filled" fillcolor=red]; } - subgraph cluster_22 { - color=blue - 62 [label="Enter function getChildren [2]" style="filled" fillcolor=red]; - subgraph cluster_23 { - color=blue - 63 [label="Enter block [2]"]; - 64 [label="Access variable R|/LighterASTNode._children| [2]"]; - 65 [label="Jump: ^getChildren this@R|/LighterASTNode|.R|/LighterASTNode._children| [2]"]; - 66 [label="Stub [2]" style="filled" fillcolor=gray]; - 67 [label="Exit block [2]" style="filled" fillcolor=gray]; - } - 68 [label="Exit function getChildren [2]" style="filled" fillcolor=red]; - } 45 -> {46} [color=green]; 45 -> {61} [style=dotted]; 45 -> {46 49 53} [style=dashed]; @@ -220,8 +207,20 @@ digraph kt44814_kt { 58 -> {59}; 59 -> {60}; 60 -> {61} [color=green]; - 61 -> {62} [color=green]; - 61 -> {62} [style=dashed]; + + subgraph cluster_22 { + color=red + 62 [label="Enter function getChildren [2]" style="filled" fillcolor=red]; + subgraph cluster_23 { + color=blue + 63 [label="Enter block [2]"]; + 64 [label="Access variable R|/LighterASTNode._children| [2]"]; + 65 [label="Jump: ^getChildren this@R|/LighterASTNode|.R|/LighterASTNode._children| [2]"]; + 66 [label="Stub [2]" style="filled" fillcolor=gray]; + 67 [label="Exit block [2]" style="filled" fillcolor=gray]; + } + 68 [label="Exit function getChildren [2]" style="filled" fillcolor=red]; + } 62 -> {63}; 63 -> {64}; 64 -> {65}; @@ -241,8 +240,15 @@ digraph kt44814_kt { } 73 [label="Exit class TokenType [1]" style="filled" fillcolor=red]; } + 69 -> {70} [color=green]; + 69 -> {73} [style=dotted]; + 69 -> {70} [style=dashed]; + 70 -> {71}; + 71 -> {72}; + 72 -> {73} [color=green]; + subgraph cluster_26 { - color=blue + color=red 74 [label="Enter class Companion [2]" style="filled" fillcolor=red]; subgraph cluster_27 { color=blue @@ -258,14 +264,6 @@ digraph kt44814_kt { } 81 [label="Exit class Companion [2]" style="filled" fillcolor=red]; } - 69 -> {70} [color=green]; - 69 -> {73} [style=dotted]; - 69 -> {70} [style=dashed]; - 70 -> {71}; - 71 -> {72}; - 72 -> {73} [color=green]; - 73 -> {74} [color=green]; - 73 -> {74} [style=dashed]; 74 -> {75} [color=green]; 74 -> {81} [style=dotted]; 74 -> {75 78} [style=dashed]; @@ -362,38 +360,6 @@ digraph kt44814_kt { } 110 [label="Exit class FirModifier [1]" style="filled" fillcolor=red]; } - subgraph cluster_40 { - color=blue - 111 [label="Enter class FirLightModifier [2]" style="filled" fillcolor=red]; - subgraph cluster_41 { - color=blue - 112 [label="Enter property [3]" style="filled" fillcolor=red]; - 113 [label="Access variable R|/tree| [3]"]; - 114 [label="Exit property [3]" style="filled" fillcolor=red]; - } - subgraph cluster_42 { - color=blue - 115 [label="Enter function [3]" style="filled" fillcolor=red]; - 116 [label="Access variable R|/node| [3]"]; - 117 [label="Access variable R|/token| [3]"]; - 118 [label="Delegated constructor call: super|>(...) [3]" style="filled" fillcolor=yellow]; - 119 [label="Exit function [3]" style="filled" fillcolor=red]; - } - 120 [label="Exit class FirLightModifier [2]" style="filled" fillcolor=red]; - } - subgraph cluster_43 { - color=blue - 121 [label="Enter class FirPsiModifier [2]" style="filled" fillcolor=red]; - subgraph cluster_44 { - color=blue - 122 [label="Enter function [3]" style="filled" fillcolor=red]; - 123 [label="Access variable R|/node| [3]"]; - 124 [label="Access variable R|/token| [3]"]; - 125 [label="Delegated constructor call: super|>(...) [3]" style="filled" fillcolor=yellow]; - 126 [label="Exit function [3]" style="filled" fillcolor=red]; - } - 127 [label="Exit class FirPsiModifier [2]" style="filled" fillcolor=red]; - } 100 -> {101} [color=green]; 100 -> {110} [style=dotted]; 100 -> {101 104 107} [style=dashed]; @@ -406,22 +372,54 @@ digraph kt44814_kt { 107 -> {108}; 108 -> {109}; 109 -> {110} [color=green]; - 110 -> {111 121} [color=green]; - 110 -> {111 121} [style=dashed]; + + subgraph cluster_40 { + color=red + 111 [label="Enter class FirPsiModifier [2]" style="filled" fillcolor=red]; + subgraph cluster_41 { + color=blue + 112 [label="Enter function [3]" style="filled" fillcolor=red]; + 113 [label="Access variable R|/node| [3]"]; + 114 [label="Access variable R|/token| [3]"]; + 115 [label="Delegated constructor call: super|>(...) [3]" style="filled" fillcolor=yellow]; + 116 [label="Exit function [3]" style="filled" fillcolor=red]; + } + 117 [label="Exit class FirPsiModifier [2]" style="filled" fillcolor=red]; + } 111 -> {112} [color=green]; - 111 -> {120} [style=dotted]; - 111 -> {112 115} [style=dashed]; + 111 -> {117} [style=dotted]; + 111 -> {112} [style=dashed]; 112 -> {113}; 113 -> {114}; - 114 -> {115} [color=green]; + 114 -> {115}; 115 -> {116}; - 116 -> {117}; - 117 -> {118}; - 118 -> {119}; - 119 -> {120} [color=green]; + 116 -> {117} [color=green]; + + subgraph cluster_42 { + color=red + 118 [label="Enter class FirLightModifier [2]" style="filled" fillcolor=red]; + subgraph cluster_43 { + color=blue + 119 [label="Enter property [3]" style="filled" fillcolor=red]; + 120 [label="Access variable R|/tree| [3]"]; + 121 [label="Exit property [3]" style="filled" fillcolor=red]; + } + subgraph cluster_44 { + color=blue + 122 [label="Enter function [3]" style="filled" fillcolor=red]; + 123 [label="Access variable R|/node| [3]"]; + 124 [label="Access variable R|/token| [3]"]; + 125 [label="Delegated constructor call: super|>(...) [3]" style="filled" fillcolor=yellow]; + 126 [label="Exit function [3]" style="filled" fillcolor=red]; + } + 127 [label="Exit class FirLightModifier [2]" style="filled" fillcolor=red]; + } + 118 -> {119} [color=green]; + 118 -> {127} [style=dotted]; + 118 -> {119 122} [style=dashed]; + 119 -> {120}; + 120 -> {121}; 121 -> {122} [color=green]; - 121 -> {127} [style=dotted]; - 121 -> {122} [style=dashed]; 122 -> {123}; 123 -> {124}; 124 -> {125}; @@ -445,193 +443,211 @@ digraph kt44814_kt { } 135 [label="Exit class FirModifierList [1]" style="filled" fillcolor=red]; } + 128 -> {129} [color=green]; + 128 -> {135} [style=dotted]; + 128 -> {129 132} [style=dashed]; + 129 -> {130}; + 130 -> {131}; + 131 -> {132} [color=green]; + 132 -> {133}; + 133 -> {134}; + 134 -> {135} [color=green]; + subgraph cluster_48 { - color=blue - 136 [label="Enter class Companion [2]" style="filled" fillcolor=red]; + color=red + 136 [label="Enter class FirPsiModifierList [2]" style="filled" fillcolor=red]; subgraph cluster_49 { color=blue - 137 [label="Enter function [3]" style="filled" fillcolor=red]; - 138 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; - 139 [label="Exit function [3]" style="filled" fillcolor=red]; + 137 [label="Enter property [3]" style="filled" fillcolor=red]; + 138 [label="Access variable R|/modifierList| [3]"]; + 139 [label="Exit property [3]" style="filled" fillcolor=red]; } - 140 [label="Exit class Companion [2]" style="filled" fillcolor=red]; - } - subgraph cluster_50 { - color=blue - 141 [label="Enter function boxImpl [3]" style="filled" fillcolor=red]; - subgraph cluster_51 { + subgraph cluster_50 { color=blue - 142 [label="Enter block [3]"]; - 143 [label="Function call: R|/LighterASTNode.LighterASTNode|() [3]" style="filled" fillcolor=yellow]; - 144 [label="Function call: R|kotlin/collections/listOf|(...) [3]" style="filled" fillcolor=yellow]; - 145 [label="Function call: R|/LighterASTNode.LighterASTNode|(...) [3]" style="filled" fillcolor=yellow]; - 146 [label="Function call: R|/FlyweightCapableTreeStructure.FlyweightCapableTreeStructure|() [3]" style="filled" fillcolor=yellow]; - 147 [label="Function call: R|/FirLightSourceElement.FirLightSourceElement|(...) [3]" style="filled" fillcolor=yellow]; - 148 [label="Variable declaration: lval sourceElement: R|FirSourceElement?| [3]"]; - 149 [label="Access variable R|/sourceElement| [3]"]; - 150 [label="Function call: (this@R|/FirModifierList.Companion|, R|/sourceElement|).R|/FirModifierList.Companion.getModifierList|() [3]" style="filled" fillcolor=yellow]; - 151 [label="Variable declaration: lval result: R|FirModifierList?| [3]"]; - subgraph cluster_52 { - color=blue - 152 [label="Enter when [3]"]; - subgraph cluster_53 { - color=blue - 153 [label="Enter when branch condition [3]"]; - 154 [label="Access variable R|/result| [3]"]; - 155 [label="Type operator: (R|/result| is R|FirModifierList.FirLightModifierList|) [3]"]; - 156 [label="Exit when branch condition [3]"]; - } - subgraph cluster_54 { - color=blue - 157 [label="Enter when branch condition else [3]"]; - 158 [label="Exit when branch condition [3]"]; - } - 159 [label="Enter when branch result [3]"]; - subgraph cluster_55 { - color=blue - 160 [label="Enter block [3]"]; - 161 [label="Const: String(Fail) [3]"]; - 162 [label="Exit block [3]"]; - } - 163 [label="Exit when branch result [3]"]; - 164 [label="Enter when branch result [3]"]; - subgraph cluster_56 { - color=blue - 165 [label="Enter block [3]"]; - 166 [label="Const: String(OK) [3]"]; - 167 [label="Exit block [3]"]; - } - 168 [label="Exit when branch result [3]"]; - 169 [label="Exit when [3]"]; - } - 170 [label="Jump: ^boxImpl when () { - (R|/result| is R|FirModifierList.FirLightModifierList|) -> { - String(OK) - } - else -> { - String(Fail) - } -} - [3]"]; - 171 [label="Stub [3]" style="filled" fillcolor=gray]; - 172 [label="Exit block [3]" style="filled" fillcolor=gray]; + 140 [label="Enter function [3]" style="filled" fillcolor=red]; + 141 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; + 142 [label="Exit function [3]" style="filled" fillcolor=red]; } - 173 [label="Exit function boxImpl [3]" style="filled" fillcolor=red]; + 143 [label="Exit class FirPsiModifierList [2]" style="filled" fillcolor=red]; } + 136 -> {137} [color=green]; + 136 -> {143} [style=dotted]; + 136 -> {137 140} [style=dashed]; + 137 -> {138}; + 138 -> {139}; + 139 -> {140} [color=green]; + 140 -> {141}; + 141 -> {142}; + 142 -> {143} [color=green]; + + subgraph cluster_51 { + color=red + 144 [label="Enter class FirLightModifierList [2]" style="filled" fillcolor=red]; + subgraph cluster_52 { + color=blue + 145 [label="Enter property [3]" style="filled" fillcolor=red]; + 146 [label="Access variable R|/modifierList| [3]"]; + 147 [label="Exit property [3]" style="filled" fillcolor=red]; + } + subgraph cluster_53 { + color=blue + 148 [label="Enter property [3]" style="filled" fillcolor=red]; + 149 [label="Access variable R|/tree| [3]"]; + 150 [label="Exit property [3]" style="filled" fillcolor=red]; + } + subgraph cluster_54 { + color=blue + 151 [label="Enter function [3]" style="filled" fillcolor=red]; + 152 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; + 153 [label="Exit function [3]" style="filled" fillcolor=red]; + } + 154 [label="Exit class FirLightModifierList [2]" style="filled" fillcolor=red]; + } + 144 -> {145} [color=green]; + 144 -> {154} [style=dotted]; + 144 -> {145 148 151} [style=dashed]; + 145 -> {146}; + 146 -> {147}; + 147 -> {148} [color=green]; + 148 -> {149}; + 149 -> {150}; + 150 -> {151} [color=green]; + 151 -> {152}; + 152 -> {153}; + 153 -> {154} [color=green]; + + subgraph cluster_55 { + color=red + 155 [label="Enter class Companion [2]" style="filled" fillcolor=red]; + subgraph cluster_56 { + color=blue + 156 [label="Enter function [3]" style="filled" fillcolor=red]; + 157 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; + 158 [label="Exit function [3]" style="filled" fillcolor=red]; + } + 159 [label="Exit class Companion [2]" style="filled" fillcolor=red]; + } + 155 -> {156} [color=green]; + 155 -> {159} [style=dotted]; + 155 -> {156} [style=dashed]; + 156 -> {157}; + 157 -> {158}; + 158 -> {159} [color=green]; + subgraph cluster_57 { - color=blue - 174 [label="Enter function getModifierList [3]" style="filled" fillcolor=red]; + color=red + 160 [label="Enter function getModifierList [3]" style="filled" fillcolor=red]; subgraph cluster_58 { color=blue - 175 [label="Enter block [3]"]; + 161 [label="Enter block [3]"]; subgraph cluster_59 { color=blue - 176 [label="Enter when [3]"]; - 177 [label="Access variable this@R|/FirModifierList.Companion.getModifierList| [3]"]; + 162 [label="Enter when [3]"]; + 163 [label="Access variable this@R|/FirModifierList.Companion.getModifierList| [3]"]; subgraph cluster_60 { color=blue - 178 [label="Enter when branch condition [3]"]; - 179 [label="Exit $subj [3]"]; - 180 [label="Const: Null(null) [3]"]; - 181 [label="Equality operator == [3]"]; - 182 [label="Exit when branch condition [3]"]; + 164 [label="Enter when branch condition [3]"]; + 165 [label="Exit $subj [3]"]; + 166 [label="Const: Null(null) [3]"]; + 167 [label="Equality operator == [3]"]; + 168 [label="Exit when branch condition [3]"]; } subgraph cluster_61 { color=blue - 183 [label="Enter when branch condition [3]"]; - 184 [label="Exit $subj [3]"]; - 185 [label="Type operator: ($subj$ is R|FirPsiSourceElement|) [3]"]; - 186 [label="Exit when branch condition [3]"]; + 169 [label="Enter when branch condition [3]"]; + 170 [label="Exit $subj [3]"]; + 171 [label="Type operator: ($subj$ is R|FirPsiSourceElement|) [3]"]; + 172 [label="Exit when branch condition [3]"]; } subgraph cluster_62 { color=blue - 187 [label="Enter when branch condition [3]"]; - 188 [label="Exit $subj [3]"]; - 189 [label="Type operator: ($subj$ is R|FirLightSourceElement|) [3]"]; - 190 [label="Exit when branch condition [3]"]; + 173 [label="Enter when branch condition [3]"]; + 174 [label="Exit $subj [3]"]; + 175 [label="Type operator: ($subj$ is R|FirLightSourceElement|) [3]"]; + 176 [label="Exit when branch condition [3]"]; } - 191 [label="Enter when branch result [3]"]; + 177 [label="Enter when branch result [3]"]; subgraph cluster_63 { color=blue - 192 [label="Enter block [3]"]; - 193 [label="Access variable R|/FirLightSourceElement.lighterASTNode| [3]"]; - 194 [label="Access variable R|/FirLightSourceElement.treeStructure| [3]"]; - 195 [label="Function call: this@R|/FirModifierList.Companion.getModifierList|.R|/FirLightSourceElement.lighterASTNode|.R|/LighterASTNode.getChildren|(...) [3]" style="filled" fillcolor=yellow]; - 196 [label="Postponed enter to lambda [3]"]; + 178 [label="Enter block [3]"]; + 179 [label="Access variable R|/FirLightSourceElement.lighterASTNode| [3]"]; + 180 [label="Access variable R|/FirLightSourceElement.treeStructure| [3]"]; + 181 [label="Function call: this@R|/FirModifierList.Companion.getModifierList|.R|/FirLightSourceElement.lighterASTNode|.R|/LighterASTNode.getChildren|(...) [3]" style="filled" fillcolor=yellow]; + 182 [label="Postponed enter to lambda [3]"]; subgraph cluster_64 { color=blue - 197 [label="Enter function [4]" style="filled" fillcolor=red]; + 183 [label="Enter function [4]" style="filled" fillcolor=red]; subgraph cluster_65 { color=blue - 198 [label="Enter block [4]"]; - 199 [label="Access variable R|/it| [4]"]; - 200 [label="Enter safe call [4]"]; - 201 [label="Access variable R|/LighterASTNode.tokenType| [4]"]; - 202 [label="Exit safe call [4]"]; - 203 [label="Access qualifier /TokenType [4]"]; - 204 [label="Access variable R|/TokenType.Companion.MODIFIER_LIST| [4]"]; - 205 [label="Equality operator == [4]"]; - 206 [label="Exit block [4]"]; + 184 [label="Enter block [4]"]; + 185 [label="Access variable R|/it| [4]"]; + 186 [label="Enter safe call [4]"]; + 187 [label="Access variable R|/LighterASTNode.tokenType| [4]"]; + 188 [label="Exit safe call [4]"]; + 189 [label="Access qualifier /TokenType [4]"]; + 190 [label="Access variable R|/TokenType.Companion.MODIFIER_LIST| [4]"]; + 191 [label="Equality operator == [4]"]; + 192 [label="Exit block [4]"]; } - 207 [label="Exit function [4]" style="filled" fillcolor=red]; + 193 [label="Exit function [4]" style="filled" fillcolor=red]; } - 208 [label="Postponed exit from lambda [3]"]; - 209 [label="Function call: this@R|/FirModifierList.Companion.getModifierList|.R|/FirLightSourceElement.lighterASTNode|.R|/LighterASTNode.getChildren|(...).R|kotlin/collections/find|(...) [3]" style="filled" fillcolor=yellow]; - 210 [label="Exit lhs of ?: [3]"]; - 211 [label="Enter rhs of ?: [3]"]; - 212 [label="Const: Null(null) [3]"]; - 213 [label="Jump: ^getModifierList Null(null) [3]"]; - 214 [label="Stub [3]" style="filled" fillcolor=gray]; - 215 [label="Lhs of ?: is not null [3]"]; - 216 [label="Exit ?: [3]"]; - 217 [label="Variable declaration: lval modifierListNode: R|LighterASTNode| [3]"]; - 218 [label="Access variable R|/modifierListNode| [3]"]; - 219 [label="Access variable R|/FirLightSourceElement.treeStructure| [3]"]; - 220 [label="Function call: R|/FirModifierList.FirLightModifierList.FirLightModifierList|(...) [3]" style="filled" fillcolor=yellow]; - 221 [label="Exit block [3]"]; + 194 [label="Postponed exit from lambda [3]"]; + 195 [label="Function call: this@R|/FirModifierList.Companion.getModifierList|.R|/FirLightSourceElement.lighterASTNode|.R|/LighterASTNode.getChildren|(...).R|kotlin/collections/find|(...) [3]" style="filled" fillcolor=yellow]; + 196 [label="Exit lhs of ?: [3]"]; + 197 [label="Enter rhs of ?: [3]"]; + 198 [label="Const: Null(null) [3]"]; + 199 [label="Jump: ^getModifierList Null(null) [3]"]; + 200 [label="Stub [3]" style="filled" fillcolor=gray]; + 201 [label="Lhs of ?: is not null [3]"]; + 202 [label="Exit ?: [3]"]; + 203 [label="Variable declaration: lval modifierListNode: R|LighterASTNode| [3]"]; + 204 [label="Access variable R|/modifierListNode| [3]"]; + 205 [label="Access variable R|/FirLightSourceElement.treeStructure| [3]"]; + 206 [label="Function call: R|/FirModifierList.FirLightModifierList.FirLightModifierList|(...) [3]" style="filled" fillcolor=yellow]; + 207 [label="Exit block [3]"]; } - 222 [label="Exit when branch result [3]"]; - 223 [label="Enter when branch result [3]"]; + 208 [label="Exit when branch result [3]"]; + 209 [label="Enter when branch result [3]"]; subgraph cluster_66 { color=blue - 224 [label="Enter block [3]"]; - 225 [label="Access variable R|/FirPsiSourceElement.psi| [3]"]; - 226 [label="Type operator: (this@R|/FirModifierList.Companion.getModifierList|.R|/FirPsiSourceElement.psi| as? R|KtModifierListOwner|) [3]"]; - 227 [label="Enter safe call [3]"]; - 228 [label="Access variable R|/KtModifierListOwner.modifierList| [3]"]; - 229 [label="Enter safe call [3]"]; - 230 [label="Postponed enter to lambda [3]"]; + 210 [label="Enter block [3]"]; + 211 [label="Access variable R|/FirPsiSourceElement.psi| [3]"]; + 212 [label="Type operator: (this@R|/FirModifierList.Companion.getModifierList|.R|/FirPsiSourceElement.psi| as? R|KtModifierListOwner|) [3]"]; + 213 [label="Enter safe call [3]"]; + 214 [label="Access variable R|/KtModifierListOwner.modifierList| [3]"]; + 215 [label="Enter safe call [3]"]; + 216 [label="Postponed enter to lambda [3]"]; subgraph cluster_67 { color=blue - 231 [label="Enter function [4]" style="filled" fillcolor=red]; + 217 [label="Enter function [4]" style="filled" fillcolor=red]; subgraph cluster_68 { color=blue - 232 [label="Enter block [4]"]; - 233 [label="Access variable R|/it| [4]"]; - 234 [label="Function call: R|/FirModifierList.FirPsiModifierList.FirPsiModifierList|(...) [4]" style="filled" fillcolor=yellow]; - 235 [label="Exit block [4]"]; + 218 [label="Enter block [4]"]; + 219 [label="Access variable R|/it| [4]"]; + 220 [label="Function call: R|/FirModifierList.FirPsiModifierList.FirPsiModifierList|(...) [4]" style="filled" fillcolor=yellow]; + 221 [label="Exit block [4]"]; } - 236 [label="Exit function [4]" style="filled" fillcolor=red]; + 222 [label="Exit function [4]" style="filled" fillcolor=red]; } - 237 [label="Postponed exit from lambda [3]"]; - 238 [label="Function call: $subj$.R|kotlin/let|(...) [3]" style="filled" fillcolor=yellow]; - 239 [label="Exit safe call [3]"]; - 240 [label="Exit safe call [3]"]; - 241 [label="Exit block [3]"]; + 223 [label="Postponed exit from lambda [3]"]; + 224 [label="Function call: $subj$.R|kotlin/let|(...) [3]" style="filled" fillcolor=yellow]; + 225 [label="Exit safe call [3]"]; + 226 [label="Exit safe call [3]"]; + 227 [label="Exit block [3]"]; } - 242 [label="Exit when branch result [3]"]; - 243 [label="Merge postponed lambda exits [3]"]; - 244 [label="Enter when branch result [3]"]; + 228 [label="Exit when branch result [3]"]; + 229 [label="Merge postponed lambda exits [3]"]; + 230 [label="Enter when branch result [3]"]; subgraph cluster_69 { color=blue - 245 [label="Enter block [3]"]; - 246 [label="Const: Null(null) [3]"]; - 247 [label="Exit block [3]"]; + 231 [label="Enter block [3]"]; + 232 [label="Const: Null(null) [3]"]; + 233 [label="Exit block [3]"]; } - 248 [label="Exit when branch result [3]"]; - 249 [label="Exit when [3]"]; + 234 [label="Exit when branch result [3]"]; + 235 [label="Exit when [3]"]; } - 250 [label="Jump: ^getModifierList when (this@R|/FirModifierList.Companion.getModifierList|) { + 236 [label="Jump: ^getModifierList when (this@R|/FirModifierList.Companion.getModifierList|) { ==($subj$, Null(null)) -> { Null(null) } @@ -650,103 +666,25 @@ digraph kt44814_kt { } } [3]"]; - 251 [label="Stub [3]" style="filled" fillcolor=gray]; - 252 [label="Exit block [3]" style="filled" fillcolor=gray]; + 237 [label="Stub [3]" style="filled" fillcolor=gray]; + 238 [label="Exit block [3]" style="filled" fillcolor=gray]; } - 253 [label="Exit function getModifierList [3]" style="filled" fillcolor=red]; + 239 [label="Exit function getModifierList [3]" style="filled" fillcolor=red]; } - subgraph cluster_70 { - color=blue - 254 [label="Enter class FirLightModifierList [2]" style="filled" fillcolor=red]; - subgraph cluster_71 { - color=blue - 255 [label="Enter property [3]" style="filled" fillcolor=red]; - 256 [label="Access variable R|/modifierList| [3]"]; - 257 [label="Exit property [3]" style="filled" fillcolor=red]; - } - subgraph cluster_72 { - color=blue - 258 [label="Enter property [3]" style="filled" fillcolor=red]; - 259 [label="Access variable R|/tree| [3]"]; - 260 [label="Exit property [3]" style="filled" fillcolor=red]; - } - subgraph cluster_73 { - color=blue - 261 [label="Enter function [3]" style="filled" fillcolor=red]; - 262 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; - 263 [label="Exit function [3]" style="filled" fillcolor=red]; - } - 264 [label="Exit class FirLightModifierList [2]" style="filled" fillcolor=red]; - } - subgraph cluster_74 { - color=blue - 265 [label="Enter class FirPsiModifierList [2]" style="filled" fillcolor=red]; - subgraph cluster_75 { - color=blue - 266 [label="Enter property [3]" style="filled" fillcolor=red]; - 267 [label="Access variable R|/modifierList| [3]"]; - 268 [label="Exit property [3]" style="filled" fillcolor=red]; - } - subgraph cluster_76 { - color=blue - 269 [label="Enter function [3]" style="filled" fillcolor=red]; - 270 [label="Delegated constructor call: super() [3]" style="filled" fillcolor=yellow]; - 271 [label="Exit function [3]" style="filled" fillcolor=red]; - } - 272 [label="Exit class FirPsiModifierList [2]" style="filled" fillcolor=red]; - } - 128 -> {129} [color=green]; - 128 -> {135} [style=dotted]; - 128 -> {129 132} [style=dashed]; - 129 -> {130}; - 130 -> {131}; - 131 -> {132} [color=green]; - 132 -> {133}; - 133 -> {134}; - 134 -> {135} [color=green]; - 135 -> {136 254 265} [color=green]; - 135 -> {136 254 265} [style=dashed]; - 136 -> {137} [color=green]; - 136 -> {140} [style=dotted]; - 136 -> {137} [style=dashed]; - 137 -> {138}; - 138 -> {139}; - 139 -> {140} [color=green]; - 140 -> {141 174} [color=green]; - 140 -> {141 174} [style=dashed]; - 141 -> {142}; - 142 -> {143}; - 143 -> {144}; - 144 -> {145}; - 145 -> {146}; - 146 -> {147}; - 147 -> {148}; - 148 -> {149}; - 149 -> {150}; - 150 -> {151}; - 151 -> {152}; - 152 -> {153}; - 153 -> {154}; - 154 -> {155}; - 155 -> {156}; - 156 -> {157 164}; - 157 -> {158}; - 158 -> {159}; - 159 -> {160}; 160 -> {161}; 161 -> {162}; 162 -> {163}; - 163 -> {169}; + 163 -> {164}; 164 -> {165}; 165 -> {166}; 166 -> {167}; 167 -> {168}; - 168 -> {169}; + 168 -> {169 230}; 169 -> {170}; - 170 -> {173}; - 170 -> {171} [style=dotted]; - 171 -> {172} [style=dotted]; - 172 -> {173} [style=dotted]; + 170 -> {171}; + 171 -> {172}; + 172 -> {173 209}; + 173 -> {174}; 174 -> {175}; 175 -> {176}; 176 -> {177}; @@ -755,11 +693,12 @@ digraph kt44814_kt { 179 -> {180}; 180 -> {181}; 181 -> {182}; - 182 -> {183 244}; + 182 -> {183 194 195}; + 182 -> {183} [style=dashed]; 183 -> {184}; 184 -> {185}; - 185 -> {186}; - 186 -> {187 223}; + 185 -> {186 188}; + 186 -> {187}; 187 -> {188}; 188 -> {189}; 189 -> {190}; @@ -768,13 +707,14 @@ digraph kt44814_kt { 192 -> {193}; 193 -> {194}; 194 -> {195}; + 194 -> {182} [color=green style=dashed]; 195 -> {196}; - 196 -> {197 208 209}; - 196 -> {197} [style=dashed]; + 196 -> {197 201}; 197 -> {198}; 198 -> {199}; - 199 -> {200 202}; - 200 -> {201}; + 199 -> {239}; + 199 -> {200} [style=dotted]; + 200 -> {202} [style=dotted]; 201 -> {202}; 202 -> {203}; 203 -> {204}; @@ -782,78 +722,137 @@ digraph kt44814_kt { 205 -> {206}; 206 -> {207}; 207 -> {208}; - 208 -> {209}; - 208 -> {196} [color=green style=dashed]; + 208 -> {235}; 209 -> {210}; - 210 -> {211 215}; + 210 -> {211}; 211 -> {212}; - 212 -> {213}; - 213 -> {253}; - 213 -> {214} [style=dotted]; - 214 -> {216} [style=dotted]; + 212 -> {213 225}; + 213 -> {214}; + 214 -> {215 225}; 215 -> {216}; - 216 -> {217}; + 216 -> {217 224}; + 216 -> {223} [style=dotted]; + 216 -> {217} [style=dashed]; 217 -> {218}; 218 -> {219}; 219 -> {220}; 220 -> {221}; 221 -> {222}; - 222 -> {249}; - 223 -> {224}; - 224 -> {225}; + 222 -> {223}; + 223 -> {224} [color=green]; + 223 -> {229} [color=red]; + 224 -> {226}; 225 -> {226}; - 226 -> {227 239}; + 226 -> {227 229}; 227 -> {228}; - 228 -> {229 239}; - 229 -> {230}; - 230 -> {231 238}; - 230 -> {237} [style=dotted]; - 230 -> {231} [style=dashed]; + 228 -> {235}; + 229 -> {235} [color=red]; + 230 -> {231}; 231 -> {232}; 232 -> {233}; 233 -> {234}; 234 -> {235}; 235 -> {236}; - 236 -> {237}; - 237 -> {238} [color=green]; - 237 -> {243} [color=red]; - 238 -> {240}; - 239 -> {240}; - 240 -> {241 243}; + 236 -> {239}; + 236 -> {237} [style=dotted]; + 237 -> {238} [style=dotted]; + 238 -> {239} [style=dotted]; + + subgraph cluster_70 { + color=red + 240 [label="Enter function boxImpl [3]" style="filled" fillcolor=red]; + subgraph cluster_71 { + color=blue + 241 [label="Enter block [3]"]; + 242 [label="Function call: R|/LighterASTNode.LighterASTNode|() [3]" style="filled" fillcolor=yellow]; + 243 [label="Function call: R|kotlin/collections/listOf|(...) [3]" style="filled" fillcolor=yellow]; + 244 [label="Function call: R|/LighterASTNode.LighterASTNode|(...) [3]" style="filled" fillcolor=yellow]; + 245 [label="Function call: R|/FlyweightCapableTreeStructure.FlyweightCapableTreeStructure|() [3]" style="filled" fillcolor=yellow]; + 246 [label="Function call: R|/FirLightSourceElement.FirLightSourceElement|(...) [3]" style="filled" fillcolor=yellow]; + 247 [label="Variable declaration: lval sourceElement: R|FirSourceElement?| [3]"]; + 248 [label="Access variable R|/sourceElement| [3]"]; + 249 [label="Function call: (this@R|/FirModifierList.Companion|, R|/sourceElement|).R|/FirModifierList.Companion.getModifierList|() [3]" style="filled" fillcolor=yellow]; + 250 [label="Variable declaration: lval result: R|FirModifierList?| [3]"]; + subgraph cluster_72 { + color=blue + 251 [label="Enter when [3]"]; + subgraph cluster_73 { + color=blue + 252 [label="Enter when branch condition [3]"]; + 253 [label="Access variable R|/result| [3]"]; + 254 [label="Type operator: (R|/result| is R|FirModifierList.FirLightModifierList|) [3]"]; + 255 [label="Exit when branch condition [3]"]; + } + subgraph cluster_74 { + color=blue + 256 [label="Enter when branch condition else [3]"]; + 257 [label="Exit when branch condition [3]"]; + } + 258 [label="Enter when branch result [3]"]; + subgraph cluster_75 { + color=blue + 259 [label="Enter block [3]"]; + 260 [label="Const: String(Fail) [3]"]; + 261 [label="Exit block [3]"]; + } + 262 [label="Exit when branch result [3]"]; + 263 [label="Enter when branch result [3]"]; + subgraph cluster_76 { + color=blue + 264 [label="Enter block [3]"]; + 265 [label="Const: String(OK) [3]"]; + 266 [label="Exit block [3]"]; + } + 267 [label="Exit when branch result [3]"]; + 268 [label="Exit when [3]"]; + } + 269 [label="Jump: ^boxImpl when () { + (R|/result| is R|FirModifierList.FirLightModifierList|) -> { + String(OK) + } + else -> { + String(Fail) + } +} + [3]"]; + 270 [label="Stub [3]" style="filled" fillcolor=gray]; + 271 [label="Exit block [3]" style="filled" fillcolor=gray]; + } + 272 [label="Exit function boxImpl [3]" style="filled" fillcolor=red]; + } + 240 -> {241}; 241 -> {242}; - 242 -> {249}; - 243 -> {249} [color=red]; + 242 -> {243}; + 243 -> {244}; 244 -> {245}; 245 -> {246}; 246 -> {247}; 247 -> {248}; 248 -> {249}; 249 -> {250}; - 250 -> {253}; - 250 -> {251} [style=dotted]; - 251 -> {252} [style=dotted]; - 252 -> {253} [style=dotted]; - 254 -> {255} [color=green]; - 254 -> {264} [style=dotted]; - 254 -> {255 258 261} [style=dashed]; - 255 -> {256}; + 250 -> {251}; + 251 -> {252}; + 252 -> {253}; + 253 -> {254}; + 254 -> {255}; + 255 -> {256 263}; 256 -> {257}; - 257 -> {258} [color=green]; + 257 -> {258}; 258 -> {259}; 259 -> {260}; - 260 -> {261} [color=green]; + 260 -> {261}; 261 -> {262}; - 262 -> {263}; - 263 -> {264} [color=green]; - 265 -> {266} [color=green]; - 265 -> {272} [style=dotted]; - 265 -> {266 269} [style=dashed]; + 262 -> {268}; + 263 -> {264}; + 264 -> {265}; + 265 -> {266}; 266 -> {267}; 267 -> {268}; - 268 -> {269} [color=green]; - 269 -> {270}; - 270 -> {271}; - 271 -> {272} [color=green]; + 268 -> {269}; + 269 -> {272}; + 269 -> {270} [style=dotted]; + 270 -> {271} [style=dotted]; + 271 -> {272} [style=dotted]; subgraph cluster_77 { color=red