Cache FirSelfImportingScope and callables inside

This commit is contained in:
Mikhail Glukhikh
2019-10-22 11:59:59 +03:00
parent f136813059
commit 374c3b4561
7 changed files with 32 additions and 14 deletions
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider
import org.jetbrains.kotlin.fir.resolve.impl.FirDependenciesSymbolProviderImpl
import org.jetbrains.kotlin.fir.resolve.impl.FirLibrarySymbolProviderImpl
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberScopeProvider
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
@@ -92,7 +92,7 @@ class FirLibrarySession private constructor(
)
) as FirSymbolProvider
)
registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider())
registerComponent(FirMemberScopeProvider::class, FirMemberScopeProvider())
registerComponent(
FirCorrespondingSupertypesCache::class,
@@ -8,14 +8,14 @@ package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.impl.*
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberScopeProvider
abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo, sessionProvider: FirSessionProvider?) :
FirSessionBase(sessionProvider) {
init {
registerComponent(FirQualifierResolver::class, FirQualifierResolverImpl(this))
registerComponent(FirTypeResolver::class, FirTypeResolverImpl(this))
registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider())
registerComponent(FirMemberScopeProvider::class, FirMemberScopeProvider())
}
}
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.references.FirThisReference
import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate
import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberScopeProvider
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -41,7 +41,7 @@ inline fun <K, V, VA : V> MutableMap<K, V>.getOrPut(key: K, defaultValue: (K) ->
val FirSession.firSymbolProvider: FirSymbolProvider by componentArrayAccessor()
val FirSession.firProvider: FirProvider by componentArrayAccessor()
val FirSession.correspondingSupertypesCache: FirCorrespondingSupertypesCache by componentArrayAccessor()
val FirSession.memberScopeProvider: FirClassDeclaredMemberScopeProvider by componentArrayAccessor()
val FirSession.memberScopeProvider: FirMemberScopeProvider by componentArrayAccessor()
fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): FirClassLikeSymbol<*>? {
val firSymbolProvider = useSiteSession.firSymbolProvider
@@ -18,7 +18,7 @@ fun MutableList<FirScope>.addImportingScopes(file: FirFile, session: FirSession,
FirExplicitStarImportingScope(file.imports, session, scopeSession),
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW),
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH),
FirSelfImportingScope(file.packageFqName, session),
selfImportingScope(file.packageFqName, session),
// TODO: explicit simple importing scope should have highest priority (higher than inner scopes added in process)
FirExplicitSimpleImportingScope(file.imports, session, scopeSession)
)
@@ -18,12 +18,14 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
class FirClassDeclaredMemberScopeProvider : FirSessionComponent {
class FirMemberScopeProvider : FirSessionComponent {
private val declaredMemberCache = mutableMapOf<FirRegularClass, FirClassDeclaredMemberScope>()
private val nestedClassifierCache = mutableMapOf<FirRegularClass, FirNestedClassifierScope>()
private val selfImportingCache = mutableMapOf<FqName, FirSelfImportingScope>()
fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
return declaredMemberCache.getOrPut(klass) {
@@ -36,6 +38,12 @@ class FirClassDeclaredMemberScopeProvider : FirSessionComponent {
FirNestedClassifierScope(klass)
}
}
fun selfImportingScope(fqName: FqName, session: FirSession): FirSelfImportingScope {
return selfImportingCache.getOrPut(fqName) {
FirSelfImportingScope(fqName, session)
}
}
}
fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
@@ -56,6 +64,10 @@ fun nestedClassifierScope(classId: ClassId, session: FirSession): FirLazyNestedC
return FirLazyNestedClassifierScope(classId, session)
}
fun selfImportingScope(fqName: FqName, session: FirSession): FirSelfImportingScope {
return session.memberScopeProvider.selfImportingScope(fqName, session)
}
class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope() {
private val nestedClassifierScope = nestedClassifierScope(klass)
@@ -22,7 +22,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
private val symbolProvider = FirSymbolProvider.getInstance(session)
private val cache = mutableMapOf<Name, FirClassifierSymbol<*>?>()
private val classifierCache = mutableMapOf<Name, FirClassifierSymbol<*>?>()
private val callableCache = mutableMapOf<Name, List<FirCallableSymbol<*>>>()
override fun processClassifiersByName(
name: Name,
@@ -32,7 +34,7 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
if (name.asString().isEmpty()) return ProcessorAction.NONE
val symbol = cache.getOrPut(name) {
val symbol = classifierCache.getOrPut(name) {
val unambiguousFqName = ClassId(fqName, name)
symbolProvider.getClassLikeSymbolByFqName(unambiguousFqName)
}
@@ -45,7 +47,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
}
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
val symbols = symbolProvider.getTopLevelCallableSymbols(fqName, name)
val symbols = callableCache.getOrPut(name) {
symbolProvider.getTopLevelCallableSymbols(fqName, name)
}
for (symbol in symbols) {
if (symbol is FirFunctionSymbol<*> && !processor(symbol)) {
return ProcessorAction.STOP
@@ -55,7 +59,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
}
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
val symbols = symbolProvider.getTopLevelCallableSymbols(fqName, name)
val symbols = callableCache.getOrPut(name) {
symbolProvider.getTopLevelCallableSymbols(fqName, name)
}
for (symbol in symbols) {
if (symbol is FirPropertySymbol && !processor(symbol)) {
return ProcessorAction.STOP
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDesignatedBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.runResolve
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.impl.FirSelfImportingScope
import org.jetbrains.kotlin.fir.scopes.impl.selfImportingScope
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
@@ -39,7 +39,7 @@ private fun FirFile.findCallableMember(
packageFqName: FqName, klassFqName: FqName?, declName: Name
): FirCallableDeclaration<*> {
val memberScope =
if (klassFqName == null) FirSelfImportingScope(this.packageFqName, session)
if (klassFqName == null) selfImportingScope(this.packageFqName, session)
else provider.getClassDeclaredMemberScope(ClassId(packageFqName, klassFqName, false))!!
var result: FirCallableDeclaration<*>? = null
val processor = { symbol: FirCallableSymbol<*> ->