From f3e4e9b16259d7b432cb081b0f495b2b6b8f1d64 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 25 Jun 2020 12:52:39 +0300 Subject: [PATCH] FIR: Make qualifier have only one static scope It's more correct as that's how it works in FE 1.0 --- .../fir/resolve/calls/QualifierReceiver.kt | 83 ++----------------- .../calls/tower/FirTowerResolverSession.kt | 13 ++- .../fir/resolve/calls/tower/TowerGroup.kt | 4 +- 3 files changed, 16 insertions(+), 84 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/QualifierReceiver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/QualifierReceiver.kt index 79cef91aba5..a6a8c7b4220 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/QualifierReceiver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/QualifierReceiver.kt @@ -6,24 +6,20 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirTypeAlias +import org.jetbrains.kotlin.fir.declarations.expandedConeType import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.ScopeSessionKey -import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider -import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.impl.FirOnlyCallablesScope import org.jetbrains.kotlin.fir.scopes.impl.FirOnlyClassifiersScope import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.types.ConeClassErrorType -import org.jetbrains.kotlin.fir.types.ConeClassLikeType -import java.util.* fun FirClassLikeDeclaration<*>.fullyExpandedClass(useSiteSession: FirSession): FirRegularClass? { @@ -53,7 +49,7 @@ fun createQualifierReceiver( abstract class QualifierReceiver(final override val explicitReceiver: FirExpression) : AbstractExplicitReceiver() { abstract fun classifierScope(): FirScope? - abstract fun callableScopes(): List + abstract fun callableScope(): FirScope? } class ClassQualifierReceiver( @@ -64,71 +60,10 @@ class ClassQualifierReceiver( val scopeSession: ScopeSession ) : QualifierReceiver(explicitReceiver) { - private companion object { - val SUPERTYPE_STATICS_SCOPE_SESSION_KEY = object : ScopeSessionKey, List>() {} - } - - private fun collectSuperTypeScopesComposedByDepth( - klass: FirClass<*>, - useSiteSession: FirSession, - scopeSession: ScopeSession, - ): List { - val result = mutableListOf() - val provider = klass.scopeProvider - val levelScopes = mutableListOf() - var currentDepth = 1 - val queue = - ArrayDeque>() - queue.addAll( - lookupSuperTypes(klass, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession).map { it to 1 }, - ) - val visitedSymbols = mutableSetOf() - while (queue.isNotEmpty()) { - val (useSiteSuperType, depth) = queue.poll() - if (depth > currentDepth) { - currentDepth = depth - result += FirCompositeScope(levelScopes.toMutableList()) - levelScopes.clear() - } - if (useSiteSuperType is ConeClassErrorType) continue - val superTypeSymbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession) as? FirRegularClassSymbol - ?: continue - if (!visitedSymbols.add(superTypeSymbol)) continue - val superTypeScope = provider.getStaticMemberScopeForCallables( - superTypeSymbol.fir, useSiteSession, scopeSession, - ) - if (superTypeScope != null) { - levelScopes += superTypeScope - } - queue.addAll( - lookupSuperTypes( - superTypeSymbol.fir, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession, - ).map { it to currentDepth + 1 }, - ) - } - return result - } - - private fun getCallableScopes( - useSiteSession: FirSession, - scopeSession: ScopeSession, - ): List { + override fun callableScope(): FirScope? { val klass = classSymbol.fir - val result = mutableListOf() val provider = klass.scopeProvider - val klassScope = provider.getStaticMemberScopeForCallables(klass, useSiteSession, scopeSession) - if (klassScope != null) { - result += klassScope - if (provider is KotlinScopeProvider) return result - result += scopeSession.getOrBuild(klass, SUPERTYPE_STATICS_SCOPE_SESSION_KEY) { - collectSuperTypeScopesComposedByDepth(klass, useSiteSession, scopeSession) - } - } - return result - } - - override fun callableScopes(): List { - return getCallableScopes(useSiteSession, scopeSession) + return provider.getStaticMemberScopeForCallables(klass, useSiteSession, scopeSession) } override fun classifierScope(): FirScope? { @@ -148,7 +83,5 @@ class PackageQualifierReceiver( return FirOnlyClassifiersScope(scope) } - override fun callableScopes(): List { - return listOf(FirOnlyCallablesScope(scope)) - } + override fun callableScope() = FirOnlyCallablesScope(scope) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt index f62c1dd7a84..dc95ddae28c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt @@ -155,13 +155,12 @@ class FirTowerResolverSession internal constructor( info: CallInfo, qualifierReceiver: QualifierReceiver? ) { if (qualifierReceiver == null) return - for ((depth, qualifierScope) in qualifierReceiver.callableScopes().withIndex()) { - processLevel( - qualifierScope.toScopeTowerLevel(includeInnerConstructors = false), - info.noStubReceiver(), TowerGroup.Qualifier(depth), - useParentGroupForInvokes = true, - ) - } + val callableScope = qualifierReceiver.callableScope() ?: return + processLevel( + callableScope.toScopeTowerLevel(includeInnerConstructors = false), + info.noStubReceiver(), TowerGroup.Qualifier, + useParentGroupForInvokes = true, + ) } private suspend fun processClassifierScope( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerGroup.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerGroup.kt index ed0990c640f..8c59716d40d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerGroup.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerGroup.kt @@ -12,7 +12,7 @@ sealed class TowerGroupKind(private val index: Int) : Comparable object ClassifierPrioritized : TowerGroupKind(-10) - class Qualifier(depth: Int) : WithDepth(0, depth) + object Qualifier : TowerGroupKind(0) object Classifier : TowerGroupKind(10) @@ -59,7 +59,7 @@ private constructor( val ClassifierPrioritized = kindOf(TowerGroupKind.ClassifierPrioritized) - fun Qualifier(depth: Int) = kindOf(TowerGroupKind.Qualifier(depth)) + val Qualifier = kindOf(TowerGroupKind.Qualifier) val Classifier = kindOf(TowerGroupKind.Classifier)