[FIR] Make session & symbolProvider abstract classes
This commit is contained in:
committed by
Mikhail Glukhikh
parent
5a06027c53
commit
810fa9c171
@@ -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())
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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
|
|
||||||
}
|
|
||||||
+1
-1
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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,
|
||||||
|
|||||||
+1
-1
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user