FIR: Simplify contract in FirScopeProvider::getUseSiteMemberScope

This commit is contained in:
Denis Zharkov
2020-01-24 15:12:30 +03:00
parent de4bfb3973
commit 6e8d67b96f
4 changed files with 15 additions and 34 deletions
@@ -13,8 +13,6 @@ import org.jetbrains.kotlin.fir.java.scopes.JavaClassEnhancementScope
import org.jetbrains.kotlin.fir.java.scopes.JavaClassUseSiteMemberScope import org.jetbrains.kotlin.fir.java.scopes.JavaClassUseSiteMemberScope
import org.jetbrains.kotlin.fir.java.scopes.JavaOverrideChecker import org.jetbrains.kotlin.fir.java.scopes.JavaOverrideChecker
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
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.FirScope
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.scopes.impl.*
@@ -33,16 +31,10 @@ class JavaScopeProvider(
) : FirScopeProvider() { ) : FirScopeProvider() {
override fun getUseSiteMemberScope( override fun getUseSiteMemberScope(
klass: FirClass<*>, klass: FirClass<*>,
substitutor: ConeSubstitutor,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope { ): FirScope =
val baseScope = buildJavaEnhancementScope(useSiteSession, klass.symbol as FirRegularClassSymbol, scopeSession, mutableSetOf()) buildJavaEnhancementScope(useSiteSession, klass.symbol as FirRegularClassSymbol, scopeSession, mutableSetOf())
if (substitutor == ConeSubstitutor.Empty) return baseScope
return scopeSession.getOrBuild(klass, ConeSubstitutionScopeKey(substitutor)) {
FirClassSubstitutionScope(useSiteSession, baseScope, scopeSession, substitutor)
}
}
private fun buildJavaEnhancementScope( private fun buildJavaEnhancementScope(
useSiteSession: FirSession, useSiteSession: FirSession,
@@ -105,7 +97,7 @@ class JavaScopeProvider(
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope? { ): FirScope? {
return FirStaticScope(getUseSiteMemberScope(klass, ConeSubstitutor.Empty, useSiteSession, scopeSession)) return FirStaticScope(getUseSiteMemberScope(klass, useSiteSession, scopeSession))
} }
} }
@@ -8,14 +8,12 @@ package org.jetbrains.kotlin.fir.builder
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
object StubFirScopeProvider : FirScopeProvider() { object StubFirScopeProvider : FirScopeProvider() {
override fun getUseSiteMemberScope( override fun getUseSiteMemberScope(
klass: FirClass<*>, klass: FirClass<*>,
substitutor: ConeSubstitutor,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope { ): FirScope {
@@ -32,7 +32,7 @@ class KotlinScopeProvider(
return substitutorByMap(originalSubstitution) return substitutorByMap(originalSubstitution)
} }
private fun buildRawUseSiteScope( override fun getUseSiteMemberScope(
klass: FirClass<*>, klass: FirClass<*>,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
@@ -60,20 +60,6 @@ class KotlinScopeProvider(
} }
} }
override fun getUseSiteMemberScope(
klass: FirClass<*>,
substitutor: ConeSubstitutor,
useSiteSession: FirSession,
scopeSession: ScopeSession
): FirScope {
if (substitutor == ConeSubstitutor.Empty) return buildRawUseSiteScope(klass, useSiteSession, scopeSession)
return scopeSession.getOrBuild(
klass, ConeSubstitutionScopeKey(substitutor)
) {
FirClassSubstitutionScope(useSiteSession, buildRawUseSiteScope(klass, useSiteSession, scopeSession), scopeSession, substitutor)
}
}
override fun getStaticMemberScopeForCallables( override fun getStaticMemberScopeForCallables(
klass: FirClass<*>, klass: FirClass<*>,
useSiteSession: FirSession, useSiteSession: FirSession,
@@ -90,7 +76,14 @@ class KotlinScopeProvider(
data class ConeSubstitutionScopeKey(val substitutor: ConeSubstitutor) : ScopeSessionKey<FirClass<*>, FirClassSubstitutionScope>() data class ConeSubstitutionScopeKey(val substitutor: ConeSubstitutor) : ScopeSessionKey<FirClass<*>, FirClassSubstitutionScope>()
fun FirClass<*>.scope(substitutor: ConeSubstitutor, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope { fun FirClass<*>.scope(substitutor: ConeSubstitutor, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope {
return scopeProvider.getUseSiteMemberScope( val basicScope = scopeProvider.getUseSiteMemberScope(
this, substitutor, useSiteSession, scopeSession this, useSiteSession, scopeSession
) )
if (substitutor == ConeSubstitutor.Empty) return basicScope
return scopeSession.getOrBuild(
this, ConeSubstitutionScopeKey(substitutor)
) {
FirClassSubstitutionScope(useSiteSession, basicScope, scopeSession, substitutor)
}
} }
@@ -8,12 +8,10 @@ package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
abstract class FirScopeProvider { abstract class FirScopeProvider {
abstract fun getUseSiteMemberScope( abstract fun getUseSiteMemberScope(
klass: FirClass<*>, klass: FirClass<*>,
substitutor: ConeSubstitutor,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope ): FirScope