[FIR] Add incoming edge for all members of local class, not only implicit ones

This commit is contained in:
Dmitriy Novozhilov
2020-03-30 09:45:48 +03:00
parent 43e9cbbbf5
commit 119d5b3740
2 changed files with 10 additions and 3 deletions
@@ -83,7 +83,7 @@ fun <F : FirClass<F>> F.runBodiesResolutionForLocalClass(
)
val graphBuilder = components.context.dataFlowAnalyzerContext.graphBuilder
val members = designationMap.keys
val members = localClassesNavigationInfo.allMembers
graphBuilder.prepareForLocalClassMembers(members)
return this.transform<F, ResolutionMode>(transformer, resolutionMode).single.also {
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.utils.keysToMap
class LocalClassesNavigationInfo(
val parentForClass: Map<FirClass<*>, FirClass<*>?>,
private val parentClassForFunction: Map<FirCallableMemberDeclaration<*>, FirClass<*>>
private val parentClassForFunction: Map<FirCallableMemberDeclaration<*>, FirClass<*>>,
val allMembers: List<FirCallableMemberDeclaration<*>>
) {
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<FirCallableMemberDeclaration<*>, FirClass<*>>()
val parentForClass = mutableMapOf<FirClass<*>, FirClass<*>?>()
val allMembers = mutableListOf<FirCallableMemberDeclaration<*>>()
private var currentPath = persistentListOf<FirClass<*>>()
override fun visitElement(element: FirElement) {}
@@ -75,9 +77,14 @@ private class NavigationInfoVisitor : FirDefaultVisitorVoid() {
visitCallableMemberDeclaration(property)
}
override fun visitConstructor(constructor: FirConstructor) {
visitCallableMemberDeclaration(constructor)
}
override fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration(
callableMemberDeclaration: FirCallableMemberDeclaration<F>
) {
allMembers += callableMemberDeclaration
if (callableMemberDeclaration.returnTypeRef !is FirImplicitTypeRef) return
resultingMap[callableMemberDeclaration] = currentPath.last()
}