FIR: Cache supetypes scopes when building callable scopes for qualifier
This commit is contained in:
+11
-3
@@ -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>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user