[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 graphBuilder = components.context.dataFlowAnalyzerContext.graphBuilder
val members = designationMap.keys val members = localClassesNavigationInfo.allMembers
graphBuilder.prepareForLocalClassMembers(members) graphBuilder.prepareForLocalClassMembers(members)
return this.transform<F, ResolutionMode>(transformer, resolutionMode).single.also { return this.transform<F, ResolutionMode>(transformer, resolutionMode).single.also {
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.utils.keysToMap
class LocalClassesNavigationInfo( class LocalClassesNavigationInfo(
val parentForClass: Map<FirClass<*>, FirClass<*>?>, 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 { val designationMap by lazy {
parentClassForFunction.keys.keysToMap { parentClassForFunction.keys.keysToMap {
@@ -39,12 +40,13 @@ fun FirClass<*>.collectLocalClassesNavigationInfo(): LocalClassesNavigationInfo
NavigationInfoVisitor().run { NavigationInfoVisitor().run {
this@collectLocalClassesNavigationInfo.accept(this@run) this@collectLocalClassesNavigationInfo.accept(this@run)
LocalClassesNavigationInfo(parentForClass, resultingMap) LocalClassesNavigationInfo(parentForClass, resultingMap, allMembers)
} }
private class NavigationInfoVisitor : FirDefaultVisitorVoid() { private class NavigationInfoVisitor : FirDefaultVisitorVoid() {
val resultingMap = mutableMapOf<FirCallableMemberDeclaration<*>, FirClass<*>>() val resultingMap = mutableMapOf<FirCallableMemberDeclaration<*>, FirClass<*>>()
val parentForClass = mutableMapOf<FirClass<*>, FirClass<*>?>() val parentForClass = mutableMapOf<FirClass<*>, FirClass<*>?>()
val allMembers = mutableListOf<FirCallableMemberDeclaration<*>>()
private var currentPath = persistentListOf<FirClass<*>>() private var currentPath = persistentListOf<FirClass<*>>()
override fun visitElement(element: FirElement) {} override fun visitElement(element: FirElement) {}
@@ -75,9 +77,14 @@ private class NavigationInfoVisitor : FirDefaultVisitorVoid() {
visitCallableMemberDeclaration(property) visitCallableMemberDeclaration(property)
} }
override fun visitConstructor(constructor: FirConstructor) {
visitCallableMemberDeclaration(constructor)
}
override fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration( override fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration(
callableMemberDeclaration: FirCallableMemberDeclaration<F> callableMemberDeclaration: FirCallableMemberDeclaration<F>
) { ) {
allMembers += callableMemberDeclaration
if (callableMemberDeclaration.returnTypeRef !is FirImplicitTypeRef) return if (callableMemberDeclaration.returnTypeRef !is FirImplicitTypeRef) return
resultingMap[callableMemberDeclaration] = currentPath.last() resultingMap[callableMemberDeclaration] = currentPath.last()
} }