[FIR] Introduce module :fir:entrypoint and FirSessionFactory for creating sessions

This commit is contained in:
Dmitriy Novozhilov
2020-08-28 16:04:00 +03:00
parent 94d58c714a
commit a8d23c36f5
25 changed files with 269 additions and 207 deletions
@@ -15,6 +15,7 @@ dependencies {
compile(project(":compiler:fir:checkers"))
compile(project(":compiler:fir:java"))
compile(project(":compiler:fir:jvm"))
implementation(project(":compiler:fir:entrypoint"))
compile(intellijDep())
compile(intellijCoreDep())
@@ -7,16 +7,17 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider
import org.jetbrains.kotlin.fir.registerCommonComponents
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.fir.session.registerCommonComponents
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.IdeSessionComponents
@@ -26,11 +27,12 @@ import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
/**
* [org.jetbrains.kotlin.fir.FirSession] responsible for all libraries analysing module transitively depends on
*/
@OptIn(PrivateSessionConstructor::class)
internal class FirIdeLibrariesSession private constructor(
override val moduleInfo: ModuleInfo,
moduleInfo: ModuleInfo,
sessionProvider: FirIdeSessionProvider,
override val scope: GlobalSearchScope
) : FirIdeSession(sessionProvider) {
) : FirIdeSession(moduleInfo, sessionProvider) {
companion object {
fun create(
moduleInfo: ModuleSourceInfo,
@@ -6,8 +6,14 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.FirModuleBasedSession
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
internal abstract class FirIdeSession(sessionProvider: FirIdeSessionProvider) : FirSession(sessionProvider) {
@OptIn(PrivateSessionConstructor::class)
internal abstract class FirIdeSession(
moduleInfo: ModuleInfo,
sessionProvider: FirIdeSessionProvider
) : FirModuleBasedSession(moduleInfo, sessionProvider) {
abstract val scope: GlobalSearchScope
}
}
@@ -10,12 +10,10 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.analysis.registerCheckersComponent
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.extensions.registerExtensions
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.java.registerJavaSpecificComponents
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -23,6 +21,10 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvide
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.resolve.transformers.PhasedFirFileResolver
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
import org.jetbrains.kotlin.fir.session.registerCheckersComponent
import org.jetbrains.kotlin.fir.session.registerCommonComponents
import org.jetbrains.kotlin.fir.session.registerJavaSpecificComponents
import org.jetbrains.kotlin.fir.session.registerResolveComponents
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
@@ -36,12 +38,13 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.util.collectTransitiveDepende
/**
* [org.jetbrains.kotlin.fir.FirSession] responsible for all Kotlin & Java source modules analysing module transitively depends on
*/
@OptIn(PrivateSessionConstructor::class)
internal class FirIdeSourcesSession private constructor(
override val moduleInfo: ModuleInfo?,
moduleInfo: ModuleInfo,
sessionProvider: FirIdeSessionProvider,
override val scope: GlobalSearchScope,
val firFileBuilder: FirFileBuilder,
) : FirIdeSession(sessionProvider) {
) : FirIdeSession(moduleInfo, sessionProvider) {
val cache get() = firIdeProvider.cache
companion object {
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.resolve.transformers.FirTransformerBasedResolveProcessor
import org.jetbrains.kotlin.fir.resolve.transformers.createAllTransformerBasedResolveProcessors
import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
import org.jetbrains.kotlin.idea.caches.project.isLibraryClasses
@@ -59,14 +60,14 @@ abstract class AbstractFirMultiModuleResolveTest : AbstractMultiModuleTest() {
private fun createSession(module: Module, provider: FirProjectSessionProvider): FirJavaModuleBasedSession {
val moduleInfo = module.productionSourceInfo()!!
return FirJavaModuleBasedSession.create(moduleInfo, provider, moduleInfo.contentScope()).also {
return FirSessionFactory.createJavaModuleBasedSession(moduleInfo, provider, moduleInfo.contentScope()).also {
it.extensionService.registerExtensions(BunchOfRegisteredExtensions.empty())
}
}
private fun createLibrarySession(moduleInfo: IdeaModuleInfo, provider: FirProjectSessionProvider): FirLibrarySession {
val contentScope = moduleInfo.contentScope()
return FirLibrarySession.create(moduleInfo, provider, contentScope, project, IDEPackagePartProvider(contentScope))
return FirSessionFactory.createLibrarySession(moduleInfo, provider, contentScope, project, IDEPackagePartProvider(contentScope))
}
private fun doFirResolveTest(dirPath: String) {