[FIR] Get rid of FirSession.moduleInfo
This commit is contained in:
committed by
TeamCityServer
parent
57a8642f5a
commit
f16194e60d
+2
-1
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirModuleVisibilityChecker
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.containerSource
|
import org.jetbrains.kotlin.fir.declarations.containerSource
|
||||||
|
import org.jetbrains.kotlin.fir.moduleData
|
||||||
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
|
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
|
||||||
import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass
|
import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass
|
||||||
@@ -18,7 +19,7 @@ import java.nio.file.Paths
|
|||||||
|
|
||||||
class FirJvmModuleVisibilityChecker(private val session: FirSession) : FirModuleVisibilityChecker {
|
class FirJvmModuleVisibilityChecker(private val session: FirSession) : FirModuleVisibilityChecker {
|
||||||
override fun isInFriendModule(declaration: FirMemberDeclaration): Boolean {
|
override fun isInFriendModule(declaration: FirMemberDeclaration): Boolean {
|
||||||
val moduleInfo = session.moduleInfo as? FirJvmModuleInfo ?: return false
|
val moduleInfo = (session.moduleData as? FirModuleInfoBasedModuleData)?.moduleInfo as? FirJvmModuleInfo ?: return false
|
||||||
val binaryClass = when (val source = declaration.containerSource) {
|
val binaryClass = when (val source = declaration.containerSource) {
|
||||||
is KotlinJvmBinarySourceElement -> source.binaryClass
|
is KotlinJvmBinarySourceElement -> source.binaryClass
|
||||||
is JvmPackagePartSource -> source.knownJvmBinaryClass
|
is JvmPackagePartSource -> source.knownJvmBinaryClass
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
|
|||||||
@OptIn(PrivateSessionConstructor::class, SessionConfiguration::class)
|
@OptIn(PrivateSessionConstructor::class, SessionConfiguration::class)
|
||||||
object FirSessionFactory {
|
object FirSessionFactory {
|
||||||
class FirSessionConfigurator(private val session: FirSession) {
|
class FirSessionConfigurator(private val session: FirSession) {
|
||||||
private val registeredExtensions = mutableListOf<BunchOfRegisteredExtensions>(BunchOfRegisteredExtensions.empty())
|
private val registeredExtensions: MutableList<BunchOfRegisteredExtensions> = mutableListOf(BunchOfRegisteredExtensions.empty())
|
||||||
|
|
||||||
fun registerExtensions(extensions: BunchOfRegisteredExtensions) {
|
fun registerExtensions(extensions: BunchOfRegisteredExtensions) {
|
||||||
registeredExtensions += extensions
|
registeredExtensions += extensions
|
||||||
@@ -78,7 +78,7 @@ object FirSessionFactory {
|
|||||||
lookupTracker: LookupTracker? = null,
|
lookupTracker: LookupTracker? = null,
|
||||||
init: FirSessionConfigurator.() -> Unit = {}
|
init: FirSessionConfigurator.() -> Unit = {}
|
||||||
): FirJavaModuleBasedSession {
|
): FirJavaModuleBasedSession {
|
||||||
return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply session@{
|
return FirJavaModuleBasedSession(sessionProvider).apply session@{
|
||||||
val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
|
val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
|
||||||
registerModuleData(moduleData)
|
registerModuleData(moduleData)
|
||||||
registerCliCompilerOnlyComponents()
|
registerCliCompilerOnlyComponents()
|
||||||
@@ -137,8 +137,9 @@ object FirSessionFactory {
|
|||||||
packagePartProvider: PackagePartProvider,
|
packagePartProvider: PackagePartProvider,
|
||||||
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
|
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
|
||||||
): FirLibrarySession {
|
): FirLibrarySession {
|
||||||
return FirLibrarySession(moduleInfo, sessionProvider).apply session@{
|
return FirLibrarySession(sessionProvider).apply session@{
|
||||||
val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
|
val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
|
||||||
|
sessionProvider.registerSession(moduleData, this)
|
||||||
registerCliCompilerOnlyComponents()
|
registerCliCompilerOnlyComponents()
|
||||||
registerCommonComponents(languageVersionSettings)
|
registerCommonComponents(languageVersionSettings)
|
||||||
|
|
||||||
|
|||||||
@@ -5,38 +5,26 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.java
|
package org.jetbrains.kotlin.fir.java
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
|
|
||||||
@OptIn(PrivateSessionConstructor::class)
|
@OptIn(PrivateSessionConstructor::class)
|
||||||
class FirJavaModuleBasedSession @PrivateSessionConstructor constructor(
|
class FirJavaModuleBasedSession @PrivateSessionConstructor constructor(
|
||||||
moduleInfo: ModuleInfo,
|
|
||||||
sessionProvider: FirProjectSessionProvider,
|
sessionProvider: FirProjectSessionProvider,
|
||||||
) : FirModuleBasedSession(moduleInfo, sessionProvider) {
|
) : FirModuleBasedSession(sessionProvider)
|
||||||
init {
|
|
||||||
sessionProvider.registerSession(moduleInfo, this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(PrivateSessionConstructor::class)
|
@OptIn(PrivateSessionConstructor::class)
|
||||||
class FirLibrarySession @PrivateSessionConstructor constructor(
|
class FirLibrarySession @PrivateSessionConstructor constructor(
|
||||||
override val moduleInfo: ModuleInfo,
|
sessionProvider: FirProjectSessionProvider
|
||||||
sessionProvider: FirProjectSessionProvider,
|
) : FirSession(sessionProvider)
|
||||||
) : FirSession(sessionProvider) {
|
|
||||||
init {
|
open class FirProjectSessionProvider : FirSessionProvider() {
|
||||||
sessionProvider.registerSession(moduleInfo, this)
|
override fun getSession(moduleData: FirModuleData): FirSession? {
|
||||||
|
return sessionCache[moduleData]
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
fun registerSession(moduleData: FirModuleData, session: FirSession) {
|
||||||
open class FirProjectSessionProvider : FirSessionProvider {
|
sessionCache[moduleData] = session
|
||||||
override fun getSession(moduleInfo: ModuleInfo): FirSession? {
|
}
|
||||||
return sessionCache[moduleInfo]
|
|
||||||
}
|
protected open val sessionCache: MutableMap<FirModuleData, FirSession> = mutableMapOf()
|
||||||
|
|
||||||
fun registerSession(moduleInfo: ModuleInfo, session: FirSession) {
|
|
||||||
sessionCache[moduleInfo] = session
|
|
||||||
}
|
|
||||||
|
|
||||||
protected open val sessionCache: MutableMap<ModuleInfo, FirSession> = mutableMapOf()
|
|
||||||
}
|
}
|
||||||
|
|||||||
-2
@@ -18,8 +18,6 @@ class FirJavaEnhancementContext private constructor(
|
|||||||
this(session, lazy(LazyThreadSafetyMode.NONE, typeQualifiersComputation))
|
this(session, lazy(LazyThreadSafetyMode.NONE, typeQualifiersComputation))
|
||||||
|
|
||||||
val defaultTypeQualifiers: JavaTypeQualifiersByElementType? by delegateForDefaultTypeQualifiers
|
val defaultTypeQualifiers: JavaTypeQualifiersByElementType? by delegateForDefaultTypeQualifiers
|
||||||
|
|
||||||
val moduleInfo get() = session.moduleInfo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractDefaultNullabilityQualifier(
|
fun extractDefaultNullabilityQualifier(
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir
|
package org.jetbrains.kotlin.fir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
|
||||||
|
|
||||||
@OptIn(PrivateSessionConstructor::class)
|
@OptIn(PrivateSessionConstructor::class)
|
||||||
abstract class FirModuleBasedSession @PrivateSessionConstructor constructor(
|
abstract class FirModuleBasedSession @PrivateSessionConstructor constructor(
|
||||||
override val moduleInfo: ModuleInfo,
|
|
||||||
sessionProvider: FirSessionProvider?
|
sessionProvider: FirSessionProvider?
|
||||||
) : FirSession(sessionProvider)
|
) : FirSession(sessionProvider)
|
||||||
|
|||||||
+4
-6
@@ -5,10 +5,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.providers.impl
|
package org.jetbrains.kotlin.fir.resolve.providers.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
|
||||||
import org.jetbrains.kotlin.fir.caches.*
|
import org.jetbrains.kotlin.fir.caches.*
|
||||||
import org.jetbrains.kotlin.fir.dependenciesWithoutSelf
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||||
@@ -31,10 +29,10 @@ open class FirDependenciesSymbolProviderImpl(session: FirSession) : FirSymbolPro
|
|||||||
|
|
||||||
|
|
||||||
protected open val dependencyProviders by lazy {
|
protected open val dependencyProviders by lazy {
|
||||||
val moduleInfo = session.moduleInfo ?: return@lazy emptyList()
|
val moduleData = session.nullableModuleData ?: return@lazy emptyList()
|
||||||
moduleInfo.dependenciesWithoutSelf().mapNotNull {
|
moduleData.dependencies.mapNotNull {
|
||||||
session.sessionProvider?.getSession(it)?.symbolProvider
|
session.sessionProvider?.getSession(it)?.symbolProvider
|
||||||
}.toList()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(FirSymbolProviderInternals::class, ExperimentalStdlibApi::class)
|
@OptIn(FirSymbolProviderInternals::class, ExperimentalStdlibApi::class)
|
||||||
|
|||||||
+2
-1
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirImport
|
import org.jetbrains.kotlin.fir.declarations.FirImport
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
||||||
|
import org.jetbrains.kotlin.fir.moduleData
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
|
||||||
|
|
||||||
@@ -24,7 +25,7 @@ class FirDefaultSimpleImportingScope(
|
|||||||
|
|
||||||
override val simpleImports = run {
|
override val simpleImports = run {
|
||||||
val importResolveTransformer = FirImportResolveTransformer(session)
|
val importResolveTransformer = FirImportResolveTransformer(session)
|
||||||
val analyzerServices = session.moduleInfo?.analyzerServices
|
val analyzerServices = session.moduleData.analyzerServices
|
||||||
val allDefaultImports = priority.getAllDefaultImports(analyzerServices, LanguageVersionSettingsImpl.DEFAULT)
|
val allDefaultImports = priority.getAllDefaultImports(analyzerServices, LanguageVersionSettingsImpl.DEFAULT)
|
||||||
allDefaultImports
|
allDefaultImports
|
||||||
?.filter { !it.isAllUnder }
|
?.filter { !it.isAllUnder }
|
||||||
|
|||||||
+2
-2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
|
import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
|
||||||
|
import org.jetbrains.kotlin.fir.moduleData
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||||
@@ -20,10 +21,9 @@ class FirDefaultStarImportingScope(
|
|||||||
filter: FirImportingScopeFilter,
|
filter: FirImportingScopeFilter,
|
||||||
priority: DefaultImportPriority
|
priority: DefaultImportPriority
|
||||||
) : FirAbstractStarImportingScope(session, scopeSession, filter, lookupInFir = false) {
|
) : FirAbstractStarImportingScope(session, scopeSession, filter, lookupInFir = false) {
|
||||||
|
|
||||||
// TODO: put languageVersionSettings into FirSession?
|
// TODO: put languageVersionSettings into FirSession?
|
||||||
override val starImports = run {
|
override val starImports = run {
|
||||||
val analyzerServices = session.moduleInfo?.analyzerServices
|
val analyzerServices = session.moduleData.analyzerServices
|
||||||
val allDefaultImports = priority.getAllDefaultImports(analyzerServices, LanguageVersionSettingsImpl.DEFAULT)
|
val allDefaultImports = priority.getAllDefaultImports(analyzerServices, LanguageVersionSettingsImpl.DEFAULT)
|
||||||
allDefaultImports
|
allDefaultImports
|
||||||
?.filter { it.isAllUnder }
|
?.filter { it.isAllUnder }
|
||||||
|
|||||||
@@ -41,4 +41,7 @@ class FirModuleDataImpl(
|
|||||||
override val analyzerServices: PlatformDependentAnalyzerServices
|
override val analyzerServices: PlatformDependentAnalyzerServices
|
||||||
) : FirModuleData()
|
) : FirModuleData()
|
||||||
|
|
||||||
val FirSession.moduleData: FirModuleData by FirSession.sessionComponentAccessor()
|
val FirSession.nullableModuleData: FirModuleData? by FirSession.nullableSessionComponentAccessor()
|
||||||
|
val FirSession.moduleData: FirModuleData
|
||||||
|
get() = nullableModuleData ?: error("Module data is not registered in $this")
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir
|
package org.jetbrains.kotlin.fir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
|
||||||
import org.jetbrains.kotlin.fir.types.impl.*
|
import org.jetbrains.kotlin.fir.types.impl.*
|
||||||
import org.jetbrains.kotlin.fir.utils.ArrayMapAccessor
|
import org.jetbrains.kotlin.fir.utils.ArrayMapAccessor
|
||||||
import org.jetbrains.kotlin.fir.utils.ComponentArrayOwner
|
import org.jetbrains.kotlin.fir.utils.ComponentArrayOwner
|
||||||
@@ -27,8 +26,6 @@ abstract class FirSession @PrivateSessionConstructor constructor(val sessionProv
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open val moduleInfo: ModuleInfo? get() = null
|
|
||||||
|
|
||||||
val javaTypeEnhancementState: JavaTypeEnhancementState? get() = null
|
val javaTypeEnhancementState: JavaTypeEnhancementState? get() = null
|
||||||
|
|
||||||
open val builtinTypes: BuiltinTypes = BuiltinTypes()
|
open val builtinTypes: BuiltinTypes = BuiltinTypes()
|
||||||
@@ -41,8 +38,8 @@ abstract class FirSession @PrivateSessionConstructor constructor(val sessionProv
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface FirSessionProvider {
|
abstract class FirSessionProvider {
|
||||||
fun getSession(moduleInfo: ModuleInfo): FirSession?
|
abstract fun getSession(moduleData: FirModuleData): FirSession?
|
||||||
}
|
}
|
||||||
|
|
||||||
class BuiltinTypes {
|
class BuiltinTypes {
|
||||||
|
|||||||
+3
-2
@@ -15,7 +15,8 @@ import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
|
|||||||
import org.jetbrains.kotlin.fir.analysis.collectors.components.*
|
import org.jetbrains.kotlin.fir.analysis.collectors.components.*
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.checkers.*
|
import org.jetbrains.kotlin.fir.checkers.*
|
||||||
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
import org.jetbrains.kotlin.fir.moduleData
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.moduleSourceInfo
|
||||||
import org.jetbrains.kotlin.platform.SimplePlatform
|
import org.jetbrains.kotlin.platform.SimplePlatform
|
||||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatform
|
import org.jetbrains.kotlin.platform.jvm.JvmPlatform
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ private object CheckersFactory {
|
|||||||
reporter: DiagnosticReporter,
|
reporter: DiagnosticReporter,
|
||||||
useExtendedCheckers: Boolean
|
useExtendedCheckers: Boolean
|
||||||
): List<AbstractDiagnosticCollectorComponent> {
|
): List<AbstractDiagnosticCollectorComponent> {
|
||||||
val moduleInfo = session.moduleInfo as ModuleSourceInfo
|
val moduleInfo = session.moduleData.moduleSourceInfo
|
||||||
val platform = moduleInfo.platform.componentPlatforms.single()
|
val platform = moduleInfo.platform.componentPlatforms.single()
|
||||||
val declarationCheckers = createDeclarationCheckers(useExtendedCheckers, platform)
|
val declarationCheckers = createDeclarationCheckers(useExtendedCheckers, platform)
|
||||||
val expressionCheckers = createExpressionCheckers(useExtendedCheckers)
|
val expressionCheckers = createExpressionCheckers(useExtendedCheckers)
|
||||||
|
|||||||
-1
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.PrivateSessionConstructor
|
|||||||
*/
|
*/
|
||||||
@OptIn(PrivateSessionConstructor::class)
|
@OptIn(PrivateSessionConstructor::class)
|
||||||
internal class FirIdeLibrariesSession @PrivateSessionConstructor constructor(
|
internal class FirIdeLibrariesSession @PrivateSessionConstructor constructor(
|
||||||
override val moduleInfo: ModuleInfo,
|
|
||||||
override val project: Project,
|
override val project: Project,
|
||||||
override val scope: GlobalSearchScope,
|
override val scope: GlobalSearchScope,
|
||||||
builtinTypes: BuiltinTypes,
|
builtinTypes: BuiltinTypes,
|
||||||
|
|||||||
-3
@@ -7,9 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
|
|||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
|
||||||
import org.jetbrains.kotlin.fir.BuiltinTypes
|
import org.jetbrains.kotlin.fir.BuiltinTypes
|
||||||
import org.jetbrains.kotlin.fir.FirModuleBasedSession
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
|
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
|
||||||
|
|
||||||
@@ -20,6 +18,5 @@ abstract class FirIdeSession(override val builtinTypes: BuiltinTypes) : FirSessi
|
|||||||
|
|
||||||
@OptIn(PrivateSessionConstructor::class)
|
@OptIn(PrivateSessionConstructor::class)
|
||||||
abstract class FirIdeModuleSession(builtinTypes: BuiltinTypes) : FirIdeSession(builtinTypes) {
|
abstract class FirIdeModuleSession(builtinTypes: BuiltinTypes) : FirIdeSession(builtinTypes) {
|
||||||
abstract override val moduleInfo: ModuleInfo
|
|
||||||
abstract val scope: GlobalSearchScope
|
abstract val scope: GlobalSearchScope
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -71,7 +71,7 @@ internal object FirIdeSessionFactory {
|
|||||||
val searchScope = ModuleProductionSourceScope(moduleInfo.module)
|
val searchScope = ModuleProductionSourceScope(moduleInfo.module)
|
||||||
val dependentModules = moduleInfo.dependenciesWithoutSelf()
|
val dependentModules = moduleInfo.dependenciesWithoutSelf()
|
||||||
.filterIsInstanceTo<ModuleSourceInfo, MutableList<ModuleSourceInfo>>(mutableListOf())
|
.filterIsInstanceTo<ModuleSourceInfo, MutableList<ModuleSourceInfo>>(mutableListOf())
|
||||||
val session = FirIdeSourcesSession(moduleInfo, dependentModules, project, searchScope, firBuilder, builtinTypes)
|
val session = FirIdeSourcesSession(dependentModules, project, searchScope, firBuilder, builtinTypes)
|
||||||
sessionsCache[moduleInfo] = session
|
sessionsCache[moduleInfo] = session
|
||||||
|
|
||||||
|
|
||||||
@@ -172,7 +172,7 @@ internal object FirIdeSessionFactory {
|
|||||||
val packagePartProvider = IDEPackagePartProvider(searchScope)
|
val packagePartProvider = IDEPackagePartProvider(searchScope)
|
||||||
|
|
||||||
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
|
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
|
||||||
FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply session@{
|
FirIdeLibrariesSession(project, searchScope, builtinTypes).apply session@{
|
||||||
val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
|
val moduleData = FirModuleInfoBasedModuleData(moduleInfo).apply { bindSession(this@session) }
|
||||||
|
|
||||||
registerIdeComponents()
|
registerIdeComponents()
|
||||||
|
|||||||
+6
-2
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
|
|||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
|
import org.jetbrains.kotlin.fir.FirModuleData
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.FirSessionProvider
|
import org.jetbrains.kotlin.fir.FirSessionProvider
|
||||||
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
|
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
|
||||||
@@ -21,8 +22,11 @@ class FirIdeSessionProvider internal constructor(
|
|||||||
val project: Project,
|
val project: Project,
|
||||||
internal val rootModuleSession: FirIdeSourcesSession,
|
internal val rootModuleSession: FirIdeSourcesSession,
|
||||||
val sessions: Map<ModuleSourceInfo, FirIdeSession>
|
val sessions: Map<ModuleSourceInfo, FirIdeSession>
|
||||||
) : FirSessionProvider {
|
) : FirSessionProvider() {
|
||||||
override fun getSession(moduleInfo: ModuleInfo): FirSession? =
|
override fun getSession(moduleData: FirModuleData): FirSession? =
|
||||||
|
sessions[moduleData.moduleSourceInfo]
|
||||||
|
|
||||||
|
fun getSession(moduleInfo: IdeaModuleInfo): FirSession? =
|
||||||
sessions[moduleInfo]
|
sessions[moduleInfo]
|
||||||
|
|
||||||
internal fun getModuleCache(moduleSourceInfo: ModuleSourceInfo): ModuleFileCache =
|
internal fun getModuleCache(moduleSourceInfo: ModuleSourceInfo): ModuleFileCache =
|
||||||
|
|||||||
+15
-6
@@ -9,12 +9,14 @@ import com.intellij.openapi.project.Project
|
|||||||
import kotlinx.collections.immutable.PersistentMap
|
import kotlinx.collections.immutable.PersistentMap
|
||||||
import kotlinx.collections.immutable.persistentMapOf
|
import kotlinx.collections.immutable.persistentMapOf
|
||||||
import kotlinx.collections.immutable.toPersistentMap
|
import kotlinx.collections.immutable.toPersistentMap
|
||||||
import org.jetbrains.kotlin.analyzer.LibraryModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
import org.jetbrains.kotlin.fir.BuiltinTypes
|
import org.jetbrains.kotlin.fir.BuiltinTypes
|
||||||
|
import org.jetbrains.kotlin.fir.FirModuleData
|
||||||
|
import org.jetbrains.kotlin.fir.moduleData
|
||||||
|
import org.jetbrains.kotlin.fir.session.FirModuleInfoBasedModuleData
|
||||||
import org.jetbrains.kotlin.idea.caches.project.LibraryModificationTracker
|
import org.jetbrains.kotlin.idea.caches.project.LibraryModificationTracker
|
||||||
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
|
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirOutOfBlockModificationTrackerFactory
|
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.util.addValueFor
|
import org.jetbrains.kotlin.idea.fir.low.level.api.util.addValueFor
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE
|
import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE
|
||||||
import org.jetbrains.kotlin.idea.util.*
|
import org.jetbrains.kotlin.idea.util.*
|
||||||
@@ -65,7 +67,7 @@ private class FromModuleViewSessionCache(
|
|||||||
private var mappings: PersistentMap<ModuleSourceInfo, FirSessionWithModificationTracker> = persistentMapOf()
|
private var mappings: PersistentMap<ModuleSourceInfo, FirSessionWithModificationTracker> = persistentMapOf()
|
||||||
|
|
||||||
val sessionInvalidator: FirSessionInvalidator = FirSessionInvalidator { session ->
|
val sessionInvalidator: FirSessionInvalidator = FirSessionInvalidator { session ->
|
||||||
mappings[session.moduleInfo]?.invalidate()
|
mappings[session.moduleData.moduleSourceInfo]?.invalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -104,7 +106,7 @@ private class FromModuleViewSessionCache(
|
|||||||
}
|
}
|
||||||
return wasSessionInvalidated.entries
|
return wasSessionInvalidated.entries
|
||||||
.mapNotNull { (session, wasInvalidated) -> session.takeUnless { wasInvalidated } }
|
.mapNotNull { (session, wasInvalidated) -> session.takeUnless { wasInvalidated } }
|
||||||
.associate { session -> session.firSession.moduleInfo to session.firSession }
|
.associate { session -> session.firSession.moduleData.moduleSourceInfo to session.firSession }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <T> Collection<T>.reversedDependencies(getDependencies: (T) -> List<T>): Map<T, List<T>> {
|
private fun <T> Collection<T>.reversedDependencies(getDependencies: (T) -> List<T>): Map<T, List<T>> {
|
||||||
@@ -121,7 +123,8 @@ private class FromModuleViewSessionCache(
|
|||||||
private class FirSessionWithModificationTracker(
|
private class FirSessionWithModificationTracker(
|
||||||
val firSession: FirIdeSourcesSession,
|
val firSession: FirIdeSourcesSession,
|
||||||
) {
|
) {
|
||||||
private val modificationTracker = firSession.moduleInfo.module.createModuleWithoutDependenciesOutOfBlockModificationTracker()
|
private val modificationTracker =
|
||||||
|
firSession.moduleData.moduleSourceInfo.module.createModuleWithoutDependenciesOutOfBlockModificationTracker()
|
||||||
|
|
||||||
private val timeStamp = modificationTracker.modificationCount
|
private val timeStamp = modificationTracker.modificationCount
|
||||||
|
|
||||||
@@ -133,4 +136,10 @@ private class FirSessionWithModificationTracker(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val isValid: Boolean get() = !isInvalidated && modificationTracker.modificationCount == timeStamp
|
val isValid: Boolean get() = !isInvalidated && modificationTracker.modificationCount == timeStamp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val FirModuleData.moduleSourceInfo: ModuleSourceInfo
|
||||||
|
get() = moduleInfoUnsafe()
|
||||||
|
|
||||||
|
inline fun <reified T : ModuleInfo> FirModuleData.moduleInfoUnsafe(): T = (this as FirModuleInfoBasedModuleData).moduleInfo as T
|
||||||
|
inline fun <reified T : ModuleInfo> FirModuleData.moduleInfoSafe(): T? = (this as FirModuleInfoBasedModuleData).moduleInfo as? T
|
||||||
|
|||||||
-3
@@ -7,17 +7,14 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
|
|||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
|
||||||
import org.jetbrains.kotlin.fir.BuiltinTypes
|
import org.jetbrains.kotlin.fir.BuiltinTypes
|
||||||
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
|
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
|
||||||
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
|
|
||||||
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
|
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
|
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
|
||||||
|
|
||||||
@OptIn(PrivateSessionConstructor::class)
|
@OptIn(PrivateSessionConstructor::class)
|
||||||
internal class FirIdeSourcesSession @PrivateSessionConstructor constructor(
|
internal class FirIdeSourcesSession @PrivateSessionConstructor constructor(
|
||||||
override val moduleInfo: ModuleSourceInfo,
|
|
||||||
val dependencies: List<ModuleSourceInfo>,
|
val dependencies: List<ModuleSourceInfo>,
|
||||||
override val project: Project,
|
override val project: Project,
|
||||||
override val scope: GlobalSearchScope,
|
override val scope: GlobalSearchScope,
|
||||||
|
|||||||
+4
-5
@@ -10,14 +10,11 @@ import com.intellij.openapi.vfs.VirtualFile
|
|||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.psi.search.FileTypeIndex
|
import com.intellij.psi.search.FileTypeIndex
|
||||||
import org.jetbrains.kotlin.fir.FirRenderer
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.dependenciesWithoutSelf
|
|
||||||
import org.jetbrains.kotlin.fir.java.*
|
import org.jetbrains.kotlin.fir.java.*
|
||||||
import org.jetbrains.kotlin.fir.psi
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.firProvider
|
import org.jetbrains.kotlin.fir.resolve.firProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
|
||||||
@@ -28,6 +25,8 @@ import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
|
|||||||
import org.jetbrains.kotlin.idea.caches.project.isLibraryClasses
|
import org.jetbrains.kotlin.idea.caches.project.isLibraryClasses
|
||||||
import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider
|
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.moduleInfoUnsafe
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.moduleSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure
|
import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure
|
||||||
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
||||||
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
|
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
|
||||||
@@ -79,7 +78,7 @@ abstract class AbstractFirMultiModuleResolveTest : AbstractMultiModuleTest() {
|
|||||||
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider)
|
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider)
|
||||||
val psiManager = PsiManager.getInstance(project)
|
val psiManager = PsiManager.getInstance(project)
|
||||||
|
|
||||||
val ideaModuleInfo = session.moduleInfo.cast<IdeaModuleInfo>()
|
val ideaModuleInfo = session.moduleData.moduleInfoUnsafe<IdeaModuleInfo>()
|
||||||
|
|
||||||
ideaModuleInfo.dependenciesWithoutSelf().forEach {
|
ideaModuleInfo.dependenciesWithoutSelf().forEach {
|
||||||
if (it is IdeaModuleInfo && it.isLibraryClasses()) {
|
if (it is IdeaModuleInfo && it.isLibraryClasses()) {
|
||||||
|
|||||||
+2
-4
@@ -11,6 +11,7 @@ import com.intellij.openapi.module.Module
|
|||||||
import com.intellij.openapi.vfs.LocalFileSystem
|
import com.intellij.openapi.vfs.LocalFileSystem
|
||||||
import com.intellij.testFramework.PsiTestUtil
|
import com.intellij.testFramework.PsiTestUtil
|
||||||
import junit.framework.Assert
|
import junit.framework.Assert
|
||||||
|
import org.jetbrains.kotlin.fir.moduleData
|
||||||
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.TestProjectModule
|
import org.jetbrains.kotlin.idea.fir.low.level.api.TestProjectModule
|
||||||
@@ -19,11 +20,8 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.TestProjectStructureReader
|
|||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.incModificationTracker
|
import org.jetbrains.kotlin.idea.fir.low.level.api.incModificationTracker
|
||||||
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
||||||
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
|
||||||
import org.jetbrains.kotlin.test.util.KtTestUtil
|
import org.jetbrains.kotlin.test.util.KtTestUtil
|
||||||
import java.nio.file.Files
|
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
import kotlin.io.path.writeText
|
|
||||||
|
|
||||||
abstract class AbstractSessionsInvalidationTest : AbstractMultiModuleTest() {
|
abstract class AbstractSessionsInvalidationTest : AbstractMultiModuleTest() {
|
||||||
override fun getTestDataPath(): String =
|
override fun getTestDataPath(): String =
|
||||||
@@ -60,7 +58,7 @@ abstract class AbstractSessionsInvalidationTest : AbstractMultiModuleTest() {
|
|||||||
val sessionsAfterOOBM = storage.getFirSessions(rootModuleSourceInfo)
|
val sessionsAfterOOBM = storage.getFirSessions(rootModuleSourceInfo)
|
||||||
|
|
||||||
val changedSessions = Sets.symmetricDifference(initialSessions, sessionsAfterOOBM)
|
val changedSessions = Sets.symmetricDifference(initialSessions, sessionsAfterOOBM)
|
||||||
val changedSessionsModulesNamesSorted = changedSessions.map { (it.moduleInfo as ModuleSourceInfo).module.name }.distinct().sorted()
|
val changedSessionsModulesNamesSorted = changedSessions.map { it.moduleData.moduleSourceInfo.module.name }.distinct().sorted()
|
||||||
|
|
||||||
Assert.assertEquals(testStructure.expectedInvalidatedModules, changedSessionsModulesNamesSorted)
|
Assert.assertEquals(testStructure.expectedInvalidatedModules, changedSessionsModulesNamesSorted)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user