From 119d5b3740a1316ee092121f61e28fead3660fa9 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 30 Mar 2020 09:45:48 +0300 Subject: [PATCH] [FIR] Add incoming edge for all members of local class, not only implicit ones --- .../body/resolve/FirImplicitBodyResolve.kt | 2 +- .../body/resolve/LocalClassesNavigation.kt | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index d1a0348b7e0..7a3b38a8649 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -83,7 +83,7 @@ fun > F.runBodiesResolutionForLocalClass( ) val graphBuilder = components.context.dataFlowAnalyzerContext.graphBuilder - val members = designationMap.keys + val members = localClassesNavigationInfo.allMembers graphBuilder.prepareForLocalClassMembers(members) return this.transform(transformer, resolutionMode).single.also { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesNavigation.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesNavigation.kt index 7dcdca46499..c27d2d4e944 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesNavigation.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesNavigation.kt @@ -14,7 +14,8 @@ import org.jetbrains.kotlin.utils.keysToMap class LocalClassesNavigationInfo( val parentForClass: Map, FirClass<*>?>, - private val parentClassForFunction: Map, FirClass<*>> + private val parentClassForFunction: Map, FirClass<*>>, + val allMembers: List> ) { val designationMap by lazy { parentClassForFunction.keys.keysToMap { @@ -39,12 +40,13 @@ fun FirClass<*>.collectLocalClassesNavigationInfo(): LocalClassesNavigationInfo NavigationInfoVisitor().run { this@collectLocalClassesNavigationInfo.accept(this@run) - LocalClassesNavigationInfo(parentForClass, resultingMap) + LocalClassesNavigationInfo(parentForClass, resultingMap, allMembers) } private class NavigationInfoVisitor : FirDefaultVisitorVoid() { val resultingMap = mutableMapOf, FirClass<*>>() val parentForClass = mutableMapOf, FirClass<*>?>() + val allMembers = mutableListOf>() private var currentPath = persistentListOf>() override fun visitElement(element: FirElement) {} @@ -75,9 +77,14 @@ private class NavigationInfoVisitor : FirDefaultVisitorVoid() { visitCallableMemberDeclaration(property) } + override fun visitConstructor(constructor: FirConstructor) { + visitCallableMemberDeclaration(constructor) + } + override fun > visitCallableMemberDeclaration( callableMemberDeclaration: FirCallableMemberDeclaration ) { + allMembers += callableMemberDeclaration if (callableMemberDeclaration.returnTypeRef !is FirImplicitTypeRef) return resultingMap[callableMemberDeclaration] = currentPath.last() }