Cache FirPackageMemberScope in ScopeSession instead of member scope provider

This commit is contained in:
Mikhail Glukhikh
2019-12-19 13:01:56 +03:00
parent cb93b25fca
commit c4e6f8a640
2 changed files with 7 additions and 15 deletions
@@ -8,7 +8,9 @@ package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
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.scopes.impl.* import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.name.FqName
fun MutableList<FirScope>.addImportingScopes(file: FirFile, session: FirSession, scopeSession: ScopeSession) { fun MutableList<FirScope>.addImportingScopes(file: FirFile, session: FirSession, scopeSession: ScopeSession) {
this += createImportingScopes(file, session, scopeSession) this += createImportingScopes(file, session, scopeSession)
@@ -26,7 +28,9 @@ fun createImportingScopes(
FirExplicitStarImportingScope(file.imports, session, scopeSession), FirExplicitStarImportingScope(file.imports, session, scopeSession),
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW), FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW),
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH), FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH),
packageMemberScope(file.packageFqName, session), scopeSession.getOrBuild(file.packageFqName, PACKAGE_MEMBER) {
FirPackageMemberScope(file.packageFqName, session)
},
// TODO: explicit simple importing scope should have highest priority (higher than inner scopes added in process) // TODO: explicit simple importing scope should have highest priority (higher than inner scopes added in process)
FirExplicitSimpleImportingScope(file.imports, session, scopeSession) FirExplicitSimpleImportingScope(file.imports, session, scopeSession)
) )
@@ -36,3 +40,5 @@ fun FirCompositeScope.addImportingScopes(file: FirFile, session: FirSession, sco
scopes.addImportingScopes(file, session, scopeSession) scopes.addImportingScopes(file, session, scopeSession)
} }
private val PACKAGE_MEMBER = scopeSessionKey<FqName, FirPackageMemberScope>()
@@ -5,21 +5,18 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.memberScopeProvider import org.jetbrains.kotlin.fir.resolve.memberScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirMemberScopeProvider : FirSessionComponent { class FirMemberScopeProvider : FirSessionComponent {
private val declaredMemberCache = mutableMapOf<FirClass<*>, FirScope>() private val declaredMemberCache = mutableMapOf<FirClass<*>, FirScope>()
private val nestedClassifierCache = mutableMapOf<FirClass<*>, FirNestedClassifierScope>() private val nestedClassifierCache = mutableMapOf<FirClass<*>, FirNestedClassifierScope>()
private val packageMemberCache = mutableMapOf<FqName, FirPackageMemberScope>()
fun declaredMemberScope( fun declaredMemberScope(
klass: FirClass<*>, klass: FirClass<*>,
@@ -37,13 +34,6 @@ class FirMemberScopeProvider : FirSessionComponent {
FirNestedClassifierScope(klass) FirNestedClassifierScope(klass)
} }
} }
// TODO: it's better to cache this scope in ScopeSession
fun packageMemberScope(fqName: FqName, session: FirSession): FirPackageMemberScope {
return packageMemberCache.getOrPut(fqName) {
FirPackageMemberScope(fqName, session)
}
}
} }
fun declaredMemberScope(klass: FirClass<*>): FirScope { fun declaredMemberScope(klass: FirClass<*>): FirScope {
@@ -79,7 +69,3 @@ fun lazyNestedClassifierScope(
return FirLazyNestedClassifierScope(classId, existingNames, symbolProvider) return FirLazyNestedClassifierScope(classId, existingNames, symbolProvider)
} }
fun packageMemberScope(fqName: FqName, session: FirSession): FirPackageMemberScope {
return session.memberScopeProvider.packageMemberScope(fqName, session)
}