FIR: Cache supetypes scopes when building callable scopes for qualifier

This commit is contained in:
Denis Zharkov
2020-05-12 12:34:30 +03:00
parent 774c5b55c3
commit 27aa0040be
2 changed files with 14 additions and 8 deletions
@@ -10,17 +10,20 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.resolve.ScopeSession 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.lookupSuperTypes
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope 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.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeClassErrorType
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import java.util.ArrayDeque import java.util.*
fun FirClassLikeDeclaration<*>.fullyExpandedClass(useSiteSession: FirSession): FirRegularClass? { fun FirClassLikeDeclaration<*>.fullyExpandedClass(useSiteSession: FirSession): FirRegularClass? {
@@ -61,6 +64,9 @@ class ClassQualifierReceiver(
val scopeSession: ScopeSession val scopeSession: ScopeSession
) : QualifierReceiver(explicitReceiver) { ) : QualifierReceiver(explicitReceiver) {
private companion object {
val SUPERTYPE_STATICS_SCOPE_SESSION_KEY = object : ScopeSessionKey<FirClass<*>, List<FirScope>>() {}
}
private fun collectSuperTypeScopesComposedByDepth( private fun collectSuperTypeScopesComposedByDepth(
klass: FirClass<*>, klass: FirClass<*>,
@@ -114,7 +120,9 @@ class ClassQualifierReceiver(
if (klassScope != null) { if (klassScope != null) {
result += klassScope result += klassScope
if (provider is KotlinScopeProvider) return result if (provider is KotlinScopeProvider) return result
result += collectSuperTypeScopesComposedByDepth(klass, useSiteSession, scopeSession) result += scopeSession.getOrBuild(klass, SUPERTYPE_STATICS_SCOPE_SESSION_KEY) {
collectSuperTypeScopesComposedByDepth(klass, useSiteSession, scopeSession)
}
} }
return result return result
} }
@@ -5,17 +5,15 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.fir.scopes.FirScope
class ScopeSession { class ScopeSession {
private val scopes = hashMapOf<Any, HashMap<ScopeSessionKey<*, *>, FirScope>>() private val scopes = hashMapOf<Any, HashMap<ScopeSessionKey<*, *>, Any>>()
var returnTypeCalculator: Any? = null var returnTypeCalculator: Any? = null
@Deprecated(level = DeprecationLevel.ERROR, message = "Only for getOrBuild") @Deprecated(level = DeprecationLevel.ERROR, message = "Only for getOrBuild")
fun scopes() = scopes fun scopes() = scopes
inline fun <reified ID : Any, reified FS : FirScope> getOrBuild(id: ID, key: ScopeSessionKey<ID, FS>, build: () -> FS): FS { inline fun <reified ID : Any, reified FS : Any> getOrBuild(id: ID, key: ScopeSessionKey<ID, FS>, build: () -> FS): FS {
@Suppress("DEPRECATION_ERROR") @Suppress("DEPRECATION_ERROR")
return scopes().getOrPut(id) { return scopes().getOrPut(id) {
hashMapOf() hashMapOf()
@@ -25,5 +23,5 @@ class ScopeSession {
} }
} }
abstract class ScopeSessionKey<ID : Any, FS : FirScope> abstract class ScopeSessionKey<ID : Any, FS : Any>