From 60462bea1c4a373e990efa946bb96b8c898c41d7 Mon Sep 17 00:00:00 2001 From: Nick Date: Mon, 27 Jul 2020 15:07:33 +0300 Subject: [PATCH] FirEffectiveVisibilityResolver: search parent in containingDeclarations When determining effective visibility of 'something', we use containing declarations from the context to find 'something' parent, to avoid calling getClassSymbolByFqName for all cases. --- .../fir/FirEffectiveVisibilityResolverImpl.kt | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityResolverImpl.kt index 4ef603e1f38..53d3191ae31 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirEffectiveVisibilityResolverImpl.kt @@ -68,20 +68,25 @@ class FirEffectiveVisibilityResolverImpl(private val session: FirSession) : FirE // TODO: fix var succeededToGetSymbol = false - if (parentClassId?.isLocal == false) { - parentSymbol = session.firSymbolProvider.getClassLikeSymbolByFqName(parentClassId) - parentSymbol?.fir.safeAs()?.let { - succeededToGetSymbol = true - parentEffectiveVisibility = resolveFor(it, null, scopeSession) - } - } - - // we suppose we can't ever get a local classId - // of some fir from outside of our containing declarations - if (!succeededToGetSymbol && parentClassId != null && containingDeclarations != null) { + // look for the containing class + // in the containingDeclarations or + // try using the firSymbolProvider + if (parentClassId != null && containingDeclarations != null) { parentClassId.findOuterContainerInfo(containingDeclarations, scopeSession)?.let { parentSymbol = it.first parentEffectiveVisibility = it.second + succeededToGetSymbol = true + } + } + + if (!succeededToGetSymbol) { + if (parentClassId?.isLocal == false) { + parentSymbol = session.firSymbolProvider.getClassLikeSymbolByFqName(parentClassId) + parentSymbol?.fir.safeAs()?.let { + parentEffectiveVisibility = resolveFor(it, null, scopeSession) + } + } else if (parentClassId?.isLocal == true) { + parentEffectiveVisibility = FirEffectiveVisibilityImpl.Local } }