[FIR] Make session & symbolProvider abstract classes

This commit is contained in:
Simon Ogorodnik
2019-06-05 18:09:55 +03:00
committed by Mikhail Glukhikh
parent 5a06027c53
commit 810fa9c171
14 changed files with 50 additions and 69 deletions
@@ -24,16 +24,15 @@ import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
class FirJavaModuleBasedSession( class FirJavaModuleBasedSession(
moduleInfo: ModuleInfo, moduleInfo: ModuleInfo,
override val sessionProvider: FirProjectSessionProvider, sessionProvider: FirProjectSessionProvider,
scope: GlobalSearchScope, scope: GlobalSearchScope,
dependenciesProvider: FirSymbolProvider? = null dependenciesProvider: FirSymbolProvider? = null
) : FirModuleBasedSession(moduleInfo), FirSymbolProviderAwareSession { ) : FirModuleBasedSession(moduleInfo, sessionProvider) {
override val firSymbolProvider: FirSymbolProvider
init { init {
sessionProvider.sessionCache[moduleInfo] = this sessionProvider.sessionCache[moduleInfo] = this
firSymbolProvider = FirCompositeSymbolProvider( _firSymbolProvider = FirCompositeSymbolProvider(
listOf( listOf(
service<FirProvider>(), service<FirProvider>(),
JavaSymbolProvider(this, sessionProvider.project, scope), JavaSymbolProvider(this, sessionProvider.project, scope),
@@ -43,25 +42,24 @@ class FirJavaModuleBasedSession(
registerComponent( registerComponent(
FirSymbolProvider::class, FirSymbolProvider::class,
firSymbolProvider _firSymbolProvider as FirSymbolProvider
) )
} }
} }
class FirLibrarySession private constructor( class FirLibrarySession private constructor(
moduleInfo: ModuleInfo, moduleInfo: ModuleInfo,
override val sessionProvider: FirProjectSessionProvider, sessionProvider: FirProjectSessionProvider,
scope: GlobalSearchScope, scope: GlobalSearchScope,
packagePartProvider: PackagePartProvider, packagePartProvider: PackagePartProvider,
kotlinClassFinder: KotlinClassFinder, kotlinClassFinder: KotlinClassFinder,
javaClassFinder: JavaClassFinder javaClassFinder: JavaClassFinder
) : FirSessionBase(), FirSymbolProviderAwareSession { ) : FirSessionBase(sessionProvider) {
override val firSymbolProvider: FirSymbolProvider
init { init {
sessionProvider.sessionCache[moduleInfo] = this sessionProvider.sessionCache[moduleInfo] = this
firSymbolProvider = _firSymbolProvider =
FirCompositeSymbolProvider( FirCompositeSymbolProvider(
listOf( listOf(
KotlinDeserializedJvmSymbolsProvider( KotlinDeserializedJvmSymbolsProvider(
@@ -77,7 +75,7 @@ class FirLibrarySession private constructor(
registerComponent( registerComponent(
FirSymbolProvider::class, FirSymbolProvider::class,
firSymbolProvider _firSymbolProvider as FirSymbolProvider
) )
registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider()) registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider())
} }
@@ -67,7 +67,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase(
} }
protected fun KtFile.toFirFile(stubMode: Boolean): FirFile = protected fun KtFile.toFirFile(stubMode: Boolean): FirFile =
RawFirBuilder(object : FirSessionBase() {}, stubMode).buildFirFile(this) RawFirBuilder(object : FirSessionBase(null) {}, stubMode).buildFirFile(this)
private fun FirElement.traverseChildren(result: MutableSet<FirElement> = hashSetOf()): MutableSet<FirElement> { private fun FirElement.traverseChildren(result: MutableSet<FirElement> = hashSetOf()): MutableSet<FirElement> {
if (!result.add(this)) { if (!result.add(this)) {
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.impl.* import org.jetbrains.kotlin.fir.resolve.impl.*
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScopeProvider
abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo) : FirSessionBase() { abstract class FirModuleBasedSession(override val moduleInfo: ModuleInfo, sessionProvider: FirSessionProvider?) :
FirSessionBase(sessionProvider) {
init { init {
val firProvider = FirProviderImpl(this) val firProvider = FirProviderImpl(this)
registerComponent(FirProvider::class, firProvider) registerComponent(FirProvider::class, firProvider)
@@ -1,12 +0,0 @@
/*
* 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
}
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
abstract class AbstractFirSymbolProvider : FirSymbolProvider { abstract class AbstractFirSymbolProvider : FirSymbolProvider() {
protected val classCache = mutableMapOf<ClassId, ConeClassLikeSymbol?>() protected val classCache = mutableMapOf<ClassId, ConeClassLikeSymbol?>()
protected val topLevelCallableCache = mutableMapOf<CallableId, List<ConeCallableSymbol>>() protected val topLevelCallableCache = mutableMapOf<CallableId, List<ConeCallableSymbol>>()
protected val packageCache = mutableMapOf<FqName, FqName?>() protected val packageCache = mutableMapOf<FqName, FqName?>()
@@ -9,32 +9,31 @@ 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.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.service import org.jetbrains.kotlin.fir.service
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface FirProvider : FirSymbolProvider { abstract class FirProvider : FirSymbolProvider() {
fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration? abstract fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration?
override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? abstract override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol?
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol> abstract override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol>
override fun getPackage(fqName: FqName): FqName? { override fun getPackage(fqName: FqName): FqName? {
if (getFirFilesByPackage(fqName).isNotEmpty()) return fqName if (getFirFilesByPackage(fqName).isNotEmpty()) return fqName
return null return null
} }
fun getFirClassifierContainerFile(fqName: ClassId): FirFile abstract fun getFirClassifierContainerFile(fqName: ClassId): FirFile
fun getFirCallableContainerFile(symbol: ConeCallableSymbol): FirFile? abstract fun getFirCallableContainerFile(symbol: ConeCallableSymbol): FirFile?
companion object { companion object {
fun getInstance(session: FirSession): FirProvider = session.service() fun getInstance(session: FirSession): FirProvider = session.service()
} }
fun getFirFilesByPackage(fqName: FqName): List<FirFile> abstract fun getFirFilesByPackage(fqName: FqName): List<FirFile>
} }
@@ -15,9 +15,9 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface FirSymbolProvider { abstract class FirSymbolProvider {
fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? abstract fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol?
fun getSymbolByLookupTag(lookupTag: ConeClassifierLookupTag): ConeClassifierSymbol? { fun getSymbolByLookupTag(lookupTag: ConeClassifierLookupTag): ConeClassifierSymbol? {
return when (lookupTag) { return when (lookupTag) {
@@ -35,22 +35,22 @@ interface FirSymbolProvider {
} }
} }
fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol> abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol>
fun getClassDeclaredMemberScope(classId: ClassId): FirScope? abstract fun getClassDeclaredMemberScope(classId: ClassId): FirScope?
fun getClassUseSiteMemberScope( abstract fun getClassUseSiteMemberScope(
classId: ClassId, classId: ClassId,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope? ): FirScope?
fun getAllCallableNamesInPackage(fqName: FqName): Set<Name> = emptySet() open fun getAllCallableNamesInPackage(fqName: FqName): Set<Name> = emptySet()
fun getClassNamesInPackage(fqName: FqName): Set<Name> = emptySet() open fun getClassNamesInPackage(fqName: FqName): Set<Name> = emptySet()
fun getAllCallableNamesInClass(classId: ClassId): Set<Name> = emptySet() open fun getAllCallableNamesInClass(classId: ClassId): Set<Name> = emptySet()
fun getNestedClassesNamesInClass(classId: ClassId): Set<Name> = emptySet() open fun getNestedClassesNamesInClass(classId: ClassId): Set<Name> = emptySet()
fun getPackage(fqName: FqName): FqName? // TODO: Replace to symbol sometime abstract fun getPackage(fqName: FqName): FqName? // TODO: Replace to symbol sometime
// TODO: should not retrieve session through the FirElement::session // TODO: should not retrieve session through the FirElement::session
fun getSessionForClass(classId: ClassId): FirSession? = getClassLikeSymbolByFqName(classId)?.toFirClassLike()?.session fun getSessionForClass(classId: ClassId): FirSession? = getClassLikeSymbolByFqName(classId)?.toFirClassLike()?.session
@@ -5,8 +5,8 @@
package org.jetbrains.kotlin.fir.resolve package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.fir.*
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
@@ -32,11 +32,10 @@ inline fun <K, V, VA : V> MutableMap<K, V>.getOrPut(key: K, defaultValue: (K) ->
} }
} }
fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? { val FirSession.firSymbolProvider: FirSymbolProvider get() = _firSymbolProvider as FirSymbolProvider? ?: service()
val firSymbolProvider =
(useSiteSession as? FirSymbolProviderAwareSession)?.firSymbolProvider
?: useSiteSession.getService(FirSymbolProvider::class)
fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? {
val firSymbolProvider = useSiteSession.firSymbolProvider
return firSymbolProvider.getSymbolByLookupTag(this) return firSymbolProvider.getSymbolByLookupTag(this)
} }
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
class FirCompositeSymbolProvider(val providers: List<FirSymbolProvider>) : FirSymbolProvider { class FirCompositeSymbolProvider(val providers: List<FirSymbolProvider>) : FirSymbolProvider() {
override fun getClassUseSiteMemberScope( override fun getClassUseSiteMemberScope(
classId: ClassId, classId: ClassId,
useSiteSession: FirSession, useSiteSession: FirSession,
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.serialization.deserialization.getName
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
import java.io.InputStream import java.io.InputStream
class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider { class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider() {
private class BuiltInsPackageFragment(stream: InputStream, val fqName: FqName, val session: FirSession) { private class BuiltInsPackageFragment(stream: InputStream, val fqName: FqName, val session: FirSession) {
lateinit var version: BuiltInsBinaryVersion lateinit var version: BuiltInsBinaryVersion
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirProviderImpl(val session: FirSession) : FirProvider { class FirProviderImpl(val session: FirSession) : FirProvider() {
override fun getFirCallableContainerFile(symbol: ConeCallableSymbol): FirFile? { override fun getFirCallableContainerFile(symbol: ConeCallableSymbol): FirFile? {
return state.callableContainerMap[symbol] return state.callableContainerMap[symbol]
} }
@@ -9,17 +9,24 @@ import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.utils.Jsr305State import org.jetbrains.kotlin.utils.Jsr305State
import kotlin.reflect.KClass import kotlin.reflect.KClass
interface FirSession { abstract class FirSession(val sessionProvider: FirSessionProvider?) {
val moduleInfo: ModuleInfo? open val moduleInfo: ModuleInfo? get() = null
val sessionProvider: FirSessionProvider? get() = null
val jsr305State: Jsr305State? get() = null val jsr305State: Jsr305State? get() = null
val components: Map<KClass<*>, Any>
val components: MutableMap<KClass<*>, Any> = mutableMapOf()
var _firSymbolProvider: Any? = null
fun <T : Any> getService(kclass: KClass<T>): T = fun <T : Any> getService(kclass: KClass<T>): T =
components[kclass] as T components[kclass] as T
protected fun <T : Any> registerComponent(tClass: KClass<T>, t: T) {
assert(tClass !in components) { "Already registered component" }
components[tClass] = t
}
} }
interface FirSessionProvider { interface FirSessionProvider {
@@ -5,18 +5,7 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo
import kotlin.reflect.KClass
abstract class FirSessionBase : FirSession { abstract class FirSessionBase(sessionProvider: FirSessionProvider?) : FirSession(sessionProvider) {
override val components: MutableMap<KClass<*>, Any> = mutableMapOf()
override val moduleInfo: ModuleInfo?
get() = null
protected fun <T : Any> registerComponent(tClass: KClass<T>, t: T) {
assert(tClass !in components) { "Already registered component" }
components[tClass] = t
}
} }
+1 -1
View File
@@ -72,7 +72,7 @@ class FirExplorerToolWindow(private val project: Project, private val toolWindow
val psiDocumentManager = PsiDocumentManager.getInstance(project) val psiDocumentManager = PsiDocumentManager.getInstance(project)
val file = runReadAction { psiDocumentManager.getPsiFile(editor.document) as? KtFile } val file = runReadAction { psiDocumentManager.getPsiFile(editor.document) as? KtFile }
if (file != null) { if (file != null) {
val firFile = runReadAction { RawFirBuilder(object : FirSessionBase() {}, stubMode = false).buildFirFile(file) } val firFile = runReadAction { RawFirBuilder(object : FirSessionBase(null) {}, stubMode = false).buildFirFile(file) }
runInEdt { runInEdt {
treeStructure.root = FirExplorerTreeNode("root = ", firFile, null) treeStructure.root = FirExplorerTreeNode("root = ", firFile, null)
builder.updateFromRoot(!init) builder.updateFromRoot(!init)