From 810fa9c171850ebb82cea92c583d0ad24eac2266 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Wed, 5 Jun 2019 18:09:55 +0300 Subject: [PATCH] [FIR] Make session & symbolProvider abstract classes --- .../fir/java/FirJavaModuleBasedSession.kt | 18 ++++++++--------- .../builder/AbstractRawFirBuilderTestCase.kt | 2 +- .../kotlin/fir/FirModuleBasedSession.kt | 3 ++- .../fir/FirSymbolProviderAwareSession.kt | 12 ----------- .../fir/resolve/AbstractFirSymbolProvider.kt | 2 +- .../kotlin/fir/resolve/FirProvider.kt | 15 +++++++------- .../kotlin/fir/resolve/FirSymbolProvider.kt | 20 +++++++++---------- .../kotlin/fir/resolve/ResolveUtils.kt | 9 ++++----- .../impl/FirCompositeSymbolProvider.kt | 2 +- .../impl/FirLibrarySymbolProviderImpl.kt | 2 +- .../fir/resolve/impl/FirProviderImpl.kt | 2 +- .../org/jetbrains/kotlin/fir/FirSession.kt | 17 +++++++++++----- .../jetbrains/kotlin/fir/FirSessionBase.kt | 13 +----------- idea/fir-view/src/FirExplorerToolWindow.kt | 2 +- 14 files changed, 50 insertions(+), 69 deletions(-) delete mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirSymbolProviderAwareSession.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt index 1e93d088610..d3cc9787e85 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt @@ -24,16 +24,15 @@ import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory class FirJavaModuleBasedSession( moduleInfo: ModuleInfo, - override val sessionProvider: FirProjectSessionProvider, + sessionProvider: FirProjectSessionProvider, scope: GlobalSearchScope, dependenciesProvider: FirSymbolProvider? = null -) : FirModuleBasedSession(moduleInfo), FirSymbolProviderAwareSession { +) : FirModuleBasedSession(moduleInfo, sessionProvider) { - override val firSymbolProvider: FirSymbolProvider init { sessionProvider.sessionCache[moduleInfo] = this - firSymbolProvider = FirCompositeSymbolProvider( + _firSymbolProvider = FirCompositeSymbolProvider( listOf( service(), JavaSymbolProvider(this, sessionProvider.project, scope), @@ -43,25 +42,24 @@ class FirJavaModuleBasedSession( registerComponent( FirSymbolProvider::class, - firSymbolProvider + _firSymbolProvider as FirSymbolProvider ) } } class FirLibrarySession private constructor( moduleInfo: ModuleInfo, - override val sessionProvider: FirProjectSessionProvider, + sessionProvider: FirProjectSessionProvider, scope: GlobalSearchScope, packagePartProvider: PackagePartProvider, kotlinClassFinder: KotlinClassFinder, javaClassFinder: JavaClassFinder -) : FirSessionBase(), FirSymbolProviderAwareSession { +) : FirSessionBase(sessionProvider) { - override val firSymbolProvider: FirSymbolProvider init { sessionProvider.sessionCache[moduleInfo] = this - firSymbolProvider = + _firSymbolProvider = FirCompositeSymbolProvider( listOf( KotlinDeserializedJvmSymbolsProvider( @@ -77,7 +75,7 @@ class FirLibrarySession private constructor( registerComponent( FirSymbolProvider::class, - firSymbolProvider + _firSymbolProvider as FirSymbolProvider ) registerComponent(FirClassDeclaredMemberScopeProvider::class, FirClassDeclaredMemberScopeProvider()) } diff --git a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt index 36d6a1e5e4f..2efba84e532 100644 --- a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt +++ b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt @@ -67,7 +67,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase( } 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 = hashSetOf()): MutableSet { if (!result.add(this)) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt index 618a3738401..09f994fe598 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirModuleBasedSession.kt @@ -10,7 +10,8 @@ import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.impl.* 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 { val firProvider = FirProviderImpl(this) registerComponent(FirProvider::class, firProvider) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirSymbolProviderAwareSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirSymbolProviderAwareSession.kt deleted file mode 100644 index f246593b2ee..00000000000 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirSymbolProviderAwareSession.kt +++ /dev/null @@ -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 -} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/AbstractFirSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/AbstractFirSymbolProvider.kt index 86b88e30b92..0b02eb0095c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/AbstractFirSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/AbstractFirSymbolProvider.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -abstract class AbstractFirSymbolProvider : FirSymbolProvider { +abstract class AbstractFirSymbolProvider : FirSymbolProvider() { protected val classCache = mutableMapOf() protected val topLevelCallableCache = mutableMapOf>() protected val packageCache = mutableMapOf() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt index 6e5204da890..85e1e62b9cb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt @@ -9,32 +9,31 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration 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.ConeClassLikeSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -interface FirProvider : FirSymbolProvider { - fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration? +abstract class FirProvider : FirSymbolProvider() { + 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 + abstract override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List override fun getPackage(fqName: FqName): FqName? { if (getFirFilesByPackage(fqName).isNotEmpty()) return fqName 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 { fun getInstance(session: FirSession): FirProvider = session.service() } - fun getFirFilesByPackage(fqName: FqName): List + abstract fun getFirFilesByPackage(fqName: FqName): List } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt index bc599c0e667..48234b0e8df 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt @@ -15,9 +15,9 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName 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? { return when (lookupTag) { @@ -35,22 +35,22 @@ interface FirSymbolProvider { } } - fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List + abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List - fun getClassDeclaredMemberScope(classId: ClassId): FirScope? - fun getClassUseSiteMemberScope( + abstract fun getClassDeclaredMemberScope(classId: ClassId): FirScope? + abstract fun getClassUseSiteMemberScope( classId: ClassId, useSiteSession: FirSession, scopeSession: ScopeSession ): FirScope? - fun getAllCallableNamesInPackage(fqName: FqName): Set = emptySet() - fun getClassNamesInPackage(fqName: FqName): Set = emptySet() + open fun getAllCallableNamesInPackage(fqName: FqName): Set = emptySet() + open fun getClassNamesInPackage(fqName: FqName): Set = emptySet() - fun getAllCallableNamesInClass(classId: ClassId): Set = emptySet() - fun getNestedClassesNamesInClass(classId: ClassId): Set = emptySet() + open fun getAllCallableNamesInClass(classId: ClassId): Set = emptySet() + open fun getNestedClassesNamesInClass(classId: ClassId): Set = 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 fun getSessionForClass(classId: ClassId): FirSession? = getClassLikeSymbolByFqName(classId)?.toFirClassLike()?.session diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 05fe49e54fc..acd926d23ed 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.fir.resolve +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.FirSymbolProviderAwareSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.service @@ -32,11 +32,10 @@ inline fun MutableMap.getOrPut(key: K, defaultValue: (K) -> } } -fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? { - val firSymbolProvider = - (useSiteSession as? FirSymbolProviderAwareSession)?.firSymbolProvider - ?: useSiteSession.getService(FirSymbolProvider::class) +val FirSession.firSymbolProvider: FirSymbolProvider get() = _firSymbolProvider as FirSymbolProvider? ?: service() +fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? { + val firSymbolProvider = useSiteSession.firSymbolProvider return firSymbolProvider.getSymbolByLookupTag(this) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt index 738dc3fb5a3..f06d96a8dca 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirCompositeSymbolProvider.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult -class FirCompositeSymbolProvider(val providers: List) : FirSymbolProvider { +class FirCompositeSymbolProvider(val providers: List) : FirSymbolProvider() { override fun getClassUseSiteMemberScope( classId: ClassId, useSiteSession: FirSession, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt index 15b9a5244f5..1d0c20246ea 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt @@ -41,7 +41,7 @@ import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult 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) { lateinit var version: BuiltInsBinaryVersion diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt index dcdb3a2b164..9f72ca4a54f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -class FirProviderImpl(val session: FirSession) : FirProvider { +class FirProviderImpl(val session: FirSession) : FirProvider() { override fun getFirCallableContainerFile(symbol: ConeCallableSymbol): FirFile? { return state.callableContainerMap[symbol] } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt index 20e415a7a14..acbe4cf5610 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt @@ -9,17 +9,24 @@ import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.utils.Jsr305State import kotlin.reflect.KClass -interface FirSession { - val moduleInfo: ModuleInfo? - - val sessionProvider: FirSessionProvider? get() = null +abstract class FirSession(val sessionProvider: FirSessionProvider?) { + open val moduleInfo: ModuleInfo? get() = null val jsr305State: Jsr305State? get() = null - val components: Map, Any> + + val components: MutableMap, Any> = mutableMapOf() + + var _firSymbolProvider: Any? = null + fun getService(kclass: KClass): T = components[kclass] as T + + protected fun registerComponent(tClass: KClass, t: T) { + assert(tClass !in components) { "Already registered component" } + components[tClass] = t + } } interface FirSessionProvider { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSessionBase.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSessionBase.kt index 430e272c445..5f190c978a0 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSessionBase.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSessionBase.kt @@ -5,18 +5,7 @@ package org.jetbrains.kotlin.fir -import org.jetbrains.kotlin.analyzer.ModuleInfo -import kotlin.reflect.KClass -abstract class FirSessionBase : FirSession { - override val components: MutableMap, Any> = mutableMapOf() - - override val moduleInfo: ModuleInfo? - get() = null - - protected fun registerComponent(tClass: KClass, t: T) { - assert(tClass !in components) { "Already registered component" } - components[tClass] = t - } +abstract class FirSessionBase(sessionProvider: FirSessionProvider?) : FirSession(sessionProvider) { } diff --git a/idea/fir-view/src/FirExplorerToolWindow.kt b/idea/fir-view/src/FirExplorerToolWindow.kt index b2498912216..d6c101b0469 100644 --- a/idea/fir-view/src/FirExplorerToolWindow.kt +++ b/idea/fir-view/src/FirExplorerToolWindow.kt @@ -72,7 +72,7 @@ class FirExplorerToolWindow(private val project: Project, private val toolWindow val psiDocumentManager = PsiDocumentManager.getInstance(project) val file = runReadAction { psiDocumentManager.getPsiFile(editor.document) as? KtFile } 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 { treeStructure.root = FirExplorerTreeNode("root = ", firFile, null) builder.updateFromRoot(!init)