FIR: Optimize access to FirSymbolProvider via session

This commit is contained in:
Denis Zharkov
2019-05-29 16:24:26 +03:00
committed by Mikhail Glukhikh
parent 5e42f0c31d
commit 91d8f1fc88
3 changed files with 42 additions and 13 deletions
@@ -26,18 +26,23 @@ class FirJavaModuleBasedSession(
override val sessionProvider: FirProjectSessionProvider, override val sessionProvider: FirProjectSessionProvider,
scope: GlobalSearchScope, scope: GlobalSearchScope,
dependenciesProvider: FirSymbolProvider? = null dependenciesProvider: FirSymbolProvider? = null
) : FirModuleBasedSession(moduleInfo) { ) : FirModuleBasedSession(moduleInfo), FirSymbolProviderAwareSession {
override val firSymbolProvider: FirSymbolProvider
init { init {
sessionProvider.sessionCache[moduleInfo] = this sessionProvider.sessionCache[moduleInfo] = this
firSymbolProvider = FirCompositeSymbolProvider(
listOf(
service<FirProvider>(),
JavaSymbolProvider(this, sessionProvider.project, scope),
dependenciesProvider ?: FirDependenciesSymbolProviderImpl(this)
)
)
registerComponent( registerComponent(
FirSymbolProvider::class, FirSymbolProvider::class,
FirCompositeSymbolProvider( firSymbolProvider
listOf(
service<FirProvider>(),
JavaSymbolProvider(this, sessionProvider.project, scope),
dependenciesProvider ?: FirDependenciesSymbolProviderImpl(this)
)
)
) )
} }
} }
@@ -49,11 +54,13 @@ class FirLibrarySession private constructor(
packagePartProvider: PackagePartProvider, packagePartProvider: PackagePartProvider,
kotlinClassFinder: KotlinClassFinder, kotlinClassFinder: KotlinClassFinder,
javaClassFinder: JavaClassFinder javaClassFinder: JavaClassFinder
) : FirSessionBase() { ) : FirSessionBase(), FirSymbolProviderAwareSession {
override val firSymbolProvider: FirSymbolProvider
init { init {
sessionProvider.sessionCache[moduleInfo] = this sessionProvider.sessionCache[moduleInfo] = this
registerComponent( firSymbolProvider =
FirSymbolProvider::class,
FirCompositeSymbolProvider( FirCompositeSymbolProvider(
listOf( listOf(
KotlinDeserializedJvmSymbolsProvider( KotlinDeserializedJvmSymbolsProvider(
@@ -66,6 +73,10 @@ class FirLibrarySession private constructor(
FirDependenciesSymbolProviderImpl(this) FirDependenciesSymbolProviderImpl(this)
) )
) )
registerComponent(
FirSymbolProvider::class,
firSymbolProvider
) )
} }
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
interface FirSymbolProviderAwareSession : FirSession {
val firSymbolProvider: FirSymbolProvider
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSymbolProviderAwareSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.service
@@ -31,8 +32,13 @@ inline fun <K, V, VA : V> MutableMap<K, V>.getOrPut(key: K, defaultValue: (K) ->
} }
} }
fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? = fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? {
useSiteSession.getService(FirSymbolProvider::class).getSymbolByLookupTag(this) val firSymbolProvider =
(useSiteSession as? FirSymbolProviderAwareSession)?.firSymbolProvider
?: useSiteSession.getService(FirSymbolProvider::class)
return firSymbolProvider.getSymbolByLookupTag(this)
}
fun ConeAbbreviatedType.directExpansionType(useSiteSession: FirSession): ConeClassLikeType? = fun ConeAbbreviatedType.directExpansionType(useSiteSession: FirSession): ConeClassLikeType? =
abbreviationLookupTag abbreviationLookupTag