From 7bcd3c4c13634d593ca018ac5f6df0c4f727666c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 15 Jan 2020 16:29:59 +0300 Subject: [PATCH] [FIR] Introduce & use FirScopeProvider.getStaticMemberScopeForCallables --- .../kotlin/fir/java/JavaScopeProvider.kt | 13 ++++++---- .../fir/builder/StubFirScopeProvider.kt | 8 ++++++ .../kotlin/fir/resolve/calls/FirReceivers.kt | 14 ++--------- .../kotlin/fir/scopes/KotlinScopeProvider.kt | 25 +++++++++++++------ .../kotlin/fir/scopes/FirScopeProvider.kt | 7 +++++- 5 files changed, 42 insertions(+), 25 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaScopeProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaScopeProvider.kt index f1ae582dd60..c013eb7751a 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaScopeProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaScopeProvider.kt @@ -17,10 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.ConeSubstitutionScopeKey import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScopeProvider -import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope -import org.jetbrains.kotlin.fir.scopes.impl.FirSuperTypeScope -import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope -import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScopeWithLazyNestedScope +import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.ConeClassErrorType @@ -103,7 +100,13 @@ class JavaScopeProvider( } } - + override fun getStaticMemberScopeForCallables( + klass: FirClass<*>, + useSiteSession: FirSession, + scopeSession: ScopeSession + ): FirScope? { + return FirStaticScope(getUseSiteMemberScope(klass, ConeSubstitutor.Empty, useSiteSession, scopeSession)) + } } diff --git a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/StubFirScopeProvider.kt b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/StubFirScopeProvider.kt index 26d076de615..ad4c5698e08 100644 --- a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/StubFirScopeProvider.kt +++ b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/StubFirScopeProvider.kt @@ -21,4 +21,12 @@ object StubFirScopeProvider : FirScopeProvider() { ): FirScope { error("Stub") } + + override fun getStaticMemberScopeForCallables( + klass: FirClass<*>, + useSiteSession: FirSession, + scopeSession: ScopeSession + ): FirScope? { + return null + } } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt index 66fe55efa75..0836c1631e5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.resolve.calls -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner @@ -88,17 +87,8 @@ class QualifierReceiver(override val explicitReceiver: FirResolvedQualifier) : A } } else { return (symbol as? FirClassSymbol<*>)?.let { klassSymbol -> - klassSymbol to when (val klass = klassSymbol.fir) { - is FirClassImpl -> { - when (klass.classKind) { - ClassKind.ENUM_CLASS -> FirStaticScope(declaredMemberScope(klass)) - ClassKind.OBJECT -> klass.scope(ConeSubstitutor.Empty, useSiteSession, scopeSession) - else -> null - } - } - is FirSealedClassImpl -> null - else -> /* Java */ FirStaticScope(klass.scope(ConeSubstitutor.Empty, useSiteSession, scopeSession)) - } + val klass = klassSymbol.fir + klassSymbol to klass.scopeProvider.getStaticMemberScopeForCallables(klass, useSiteSession, scopeSession) } ?: (null to null) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt index f668df4df3a..4b594c03f56 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/KotlinScopeProvider.kt @@ -5,18 +5,16 @@ package org.jetbrains.kotlin.fir.scopes -import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.inferenceContext +import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.scopes.impl.* -import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol -import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.types.ConeClassErrorType +import org.jetbrains.kotlin.fir.types.ConeClassLikeType class KotlinScopeProvider( val declaredMemberScopeDecorator: ( @@ -75,10 +73,23 @@ class KotlinScopeProvider( FirClassSubstitutionScope(useSiteSession, buildRawUseSiteScope(klass, useSiteSession, scopeSession), scopeSession, substitutor) } } + + override fun getStaticMemberScopeForCallables( + klass: FirClass<*>, + useSiteSession: FirSession, + scopeSession: ScopeSession + ): FirScope? { + return when (klass.classKind) { + ClassKind.ENUM_CLASS -> FirStaticScope(declaredMemberScope(klass)) + // TODO: should be wrapped with FirStaticScope, non-static callables should be processed separately + ClassKind.OBJECT -> getUseSiteMemberScope(klass, ConeSubstitutor.Empty, useSiteSession, scopeSession) + else -> null + } + } } -data class ConeSubstitutionScopeKey(val substitutor: ConeSubstitutor) : ScopeSessionKey, FirClassSubstitutionScope>() {} +data class ConeSubstitutionScopeKey(val substitutor: ConeSubstitutor) : ScopeSessionKey, FirClassSubstitutionScope>() fun FirClass<*>.scope(substitutor: ConeSubstitutor, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope { return scopeProvider.getUseSiteMemberScope( diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScopeProvider.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScopeProvider.kt index 9e9d440a18f..78dd7e7f531 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScopeProvider.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/scopes/FirScopeProvider.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor -import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol abstract class FirScopeProvider { abstract fun getUseSiteMemberScope( @@ -18,4 +17,10 @@ abstract class FirScopeProvider { useSiteSession: FirSession, scopeSession: ScopeSession ): FirScope + + abstract fun getStaticMemberScopeForCallables( + klass: FirClass<*>, + useSiteSession: FirSession, + scopeSession: ScopeSession + ): FirScope? }