FIR [optimization]: eliminate some unnecessary ScopeSessions

This commit is contained in:
Mikhail Glukhikh
2019-09-05 16:23:58 +03:00
parent 7ede26e8f4
commit 91f39a0ecf
14 changed files with 62 additions and 32 deletions
@@ -224,7 +224,7 @@ class QualifiedReceiverTowerLevel(session: FirSession) : SessionBasedTowerLevel(
qualifiedReceiver.packageFqName,
qualifiedReceiver.relativeClassFqName
)
), session
), session, ScopeSession()
)
@Suppress("UNCHECKED_CAST")
@@ -97,8 +97,8 @@ open class FirBodyResolveTransformer(
packageFqName = file.packageFqName
this.file = file
return withScopeCleanup(topLevelScopes) {
topLevelScopes.addImportingScopes(file, session)
topLevelScopes += FirTopLevelDeclaredMemberScope(file, session)
topLevelScopes.addImportingScopes(file, session, scopeSession)
topLevelScopes += FirTopLevelDeclaredMemberScope(file, session, scopeSession)
super.transformFile(file, data)
}
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes
import org.jetbrains.kotlin.fir.scopes.FirPosition
import org.jetbrains.kotlin.fir.scopes.addImportingScopes
@@ -83,7 +84,8 @@ class FirSupertypeResolverTransformer : FirAbstractTreeTransformer(phase = FirRe
lateinit var resultingClass: FirDeclaration
init {
towerScope.addImportingScopes(file, session)
val scopeSession = ScopeSession()
towerScope.addImportingScopes(file, session, scopeSession)
}
override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult<FirDeclaration> {
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes
import org.jetbrains.kotlin.fir.scopes.FirPosition
import org.jetbrains.kotlin.fir.scopes.addImportingScopes
@@ -26,8 +27,9 @@ open class FirTypeResolveTransformer : FirAbstractTreeTransformerWithSuperTypes(
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
session = file.fileSession
val scopeSession = ScopeSession()
return withScopeCleanup {
towerScope.addImportingScopes(file, session)
towerScope.addImportingScopes(file, session, scopeSession)
super.transformFile(file, data)
}
}
@@ -21,22 +21,22 @@ import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
fun MutableList<FirScope>.addImportingScopes(file: FirFile, session: FirSession) {
fun MutableList<FirScope>.addImportingScopes(file: FirFile, session: FirSession, scopeSession: ScopeSession) {
this += listOf(
// from low priority to high priority
FirDefaultStarImportingScope(session, priority = DefaultImportPriority.LOW),
FirDefaultStarImportingScope(session, priority = DefaultImportPriority.HIGH),
FirExplicitStarImportingScope(file.imports, session),
FirDefaultSimpleImportingScope(session, priority = DefaultImportPriority.LOW),
FirDefaultSimpleImportingScope(session, priority = DefaultImportPriority.HIGH),
FirDefaultStarImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW),
FirDefaultStarImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH),
FirExplicitStarImportingScope(file.imports, session, scopeSession),
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.LOW),
FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH),
FirSelfImportingScope(file.packageFqName, session),
// TODO: explicit simple importing scope should have highest priority (higher than inner scopes added in process)
FirExplicitSimpleImportingScope(file.imports, session)
FirExplicitSimpleImportingScope(file.imports, session, scopeSession)
)
}
fun FirCompositeScope.addImportingScopes(file: FirFile, session: FirSession) {
scopes.addImportingScopes(file, session)
fun FirCompositeScope.addImportingScopes(file: FirFile, session: FirSession, scopeSession: ScopeSession) {
scopes.addImportingScopes(file, session, scopeSession)
}
private fun finalExpansionName(symbol: FirTypeAliasSymbol, session: FirSession): Name? {
@@ -22,14 +22,14 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.cast
abstract class FirAbstractImportingScope(session: FirSession, lookupInFir: Boolean) : FirAbstractProviderBasedScope(session, lookupInFir) {
protected val scopeCache = ScopeSession()
abstract class FirAbstractImportingScope(
session: FirSession,
protected val scopeSession: ScopeSession,
lookupInFir: Boolean
) : FirAbstractProviderBasedScope(session, lookupInFir) {
private fun getStaticsScope(classId: ClassId): FirScope? {
provider.getClassUseSiteMemberScope(classId, session, scopeCache)?.let { return it }
provider.getClassUseSiteMemberScope(classId, session, scopeSession)?.let { return it }
val symbol = provider.getClassLikeSymbolByFqName(classId) ?: error("No scope/symbol for $classId")
@@ -76,7 +76,7 @@ abstract class FirAbstractImportingScope(session: FirSession, lookupInFir: Boole
matchedClass,
processor,
session,
scopeCache,
scopeSession,
name
).stop()
) {
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.calls.TowerScopeLevel
import org.jetbrains.kotlin.fir.scopes.FirPosition
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
@@ -16,7 +17,10 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
abstract class FirAbstractSimpleImportingScope(session: FirSession) : FirAbstractImportingScope(session, lookupInFir = true) {
abstract class FirAbstractSimpleImportingScope(
session: FirSession,
scopeSession: ScopeSession
) : FirAbstractImportingScope(session, scopeSession, lookupInFir = true) {
protected abstract val simpleImports: Map<Name, List<FirResolvedImportImpl>>
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.calls.TowerScopeLevel
import org.jetbrains.kotlin.fir.scopes.FirPosition
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
@@ -16,8 +17,10 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
abstract class FirAbstractStarImportingScope(
session: FirSession, lookupInFir: Boolean = true
) : FirAbstractImportingScope(session, lookupInFir) {
session: FirSession,
scopeSession: ScopeSession,
lookupInFir: Boolean = true
) : FirAbstractImportingScope(session, scopeSession, lookupInFir) {
protected abstract val starImports: List<FirResolvedImport>
@@ -9,9 +9,14 @@ import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
class FirDefaultSimpleImportingScope(session: FirSession, priority: DefaultImportPriority) : FirAbstractSimpleImportingScope(session) {
class FirDefaultSimpleImportingScope(
session: FirSession,
scopeSession: ScopeSession,
priority: DefaultImportPriority
) : FirAbstractSimpleImportingScope(session, scopeSession) {
private fun FirImportImpl.resolve(importResolveTransformer: FirImportResolveTransformer) =
importResolveTransformer.transformImport(this, null).single as FirResolvedImportImpl
@@ -9,9 +9,14 @@ import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.impl.FirImportImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
import org.jetbrains.kotlin.fir.resolve.ScopeSession
class FirDefaultStarImportingScope(session: FirSession, priority: DefaultImportPriority, lookupInFir: Boolean = false) :
FirAbstractStarImportingScope(session, lookupInFir) {
class FirDefaultStarImportingScope(
session: FirSession,
scopeSession: ScopeSession,
priority: DefaultImportPriority,
lookupInFir: Boolean = false
) : FirAbstractStarImportingScope(session, scopeSession, lookupInFir) {
// TODO: put languageVersionSettings into FirSession?
override val starImports = run {
@@ -8,11 +8,13 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
import org.jetbrains.kotlin.fir.resolve.ScopeSession
class FirExplicitSimpleImportingScope(
imports: List<FirImport>,
session: FirSession
) : FirAbstractSimpleImportingScope(session) {
session: FirSession,
scopeSession: ScopeSession
) : FirAbstractSimpleImportingScope(session, scopeSession) {
override val simpleImports =
imports.filterIsInstance<FirResolvedImportImpl>()
@@ -8,7 +8,12 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
import org.jetbrains.kotlin.fir.resolve.ScopeSession
class FirExplicitStarImportingScope(imports: List<FirImport>, session: FirSession) : FirAbstractStarImportingScope(session) {
class FirExplicitStarImportingScope(
imports: List<FirImport>,
session: FirSession,
scopeSession: ScopeSession
) : FirAbstractStarImportingScope(session, scopeSession) {
override val starImports = imports.filterIsInstance<FirResolvedImport>().filter { it.isAllUnder }
}
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.name.Name
class FirTopLevelDeclaredMemberScope(
file: FirFile,
session: FirSession,
private val scopeSession: ScopeSession,
lookupInFir: Boolean = true
) : FirAbstractProviderBasedScope(session, lookupInFir) {
private val packageFqName = file.packageFqName
@@ -32,7 +33,7 @@ class FirTopLevelDeclaredMemberScope(
matchedClass,
processor,
session,
ScopeSession(),
scopeSession,
name
).stop()
) {
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.*
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope
@@ -39,7 +40,7 @@ private fun FirFile.findCallableMember(
packageFqName: FqName, klassFqName: FqName?, declName: Name
): FirCallableDeclaration<*> {
val memberScope =
if (klassFqName == null) FirTopLevelDeclaredMemberScope(this, session)
if (klassFqName == null) FirTopLevelDeclaredMemberScope(this, session, ScopeSession())
else provider.getClassDeclaredMemberScope(ClassId(packageFqName, klassFqName, false))!!
var result: FirCallableDeclaration<*>? = null
val processor = { symbol: FirCallableSymbol<*> ->