[analysis] introduce KtBuiltinsModule and remove hacks related to the stdlib module search

This commit is contained in:
Ilya Kirillov
2022-07-18 23:07:06 +02:00
parent dc4527462f
commit dd00062559
29 changed files with 152 additions and 187 deletions
@@ -9,6 +9,8 @@ import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirBuiltinSymbolProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirBuiltinsAndCloneableSessionProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirBuiltinsAndCloneableSession
import org.jetbrains.kotlin.analysis.project.structure.KtBuiltinsModule
import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices
import org.jetbrains.kotlin.fir.BuiltinTypes
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
import org.jetbrains.kotlin.fir.SessionConfiguration
@@ -25,6 +27,9 @@ import org.jetbrains.kotlin.fir.symbols.FirPhaseManager
import java.util.concurrent.ConcurrentHashMap
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.kotlin.platform.js.isJs
import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
@OptIn(PrivateSessionConstructor::class, SessionConfiguration::class)
@@ -39,8 +44,9 @@ import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
}
private fun createBuiltinsAndCloneableSession(platform: TargetPlatform): LLFirBuiltinsAndCloneableSession {
val builtinsModule = KtBuiltinsModule(platform, platform.getAnalyzerServices(), project)
return LLFirBuiltinsAndCloneableSession(project, builtInTypes).apply session@{
val moduleData = LLFirBuiltinsModuleData(platform, JvmPlatformAnalyzerServices/*TODO*/).apply {
val moduleData = LLFirKtModuleBasedModuleData(builtinsModule).apply {
bindSession(this@session)
}
registerIdeComponents(project)
@@ -65,4 +71,12 @@ import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
fun getInstance(project: Project): LLFirBuiltinsSessionFactory =
project.getService(LLFirBuiltinsSessionFactory::class.java)
}
}
private fun TargetPlatform.getAnalyzerServices() = when {
isJvm() -> JvmPlatformAnalyzerServices
isJs() -> JvmPlatformAnalyzerServices/*TODO*/
// isNative() -> NativePlatformAnalyzerServices
isCommon() -> CommonPlatformAnalyzerServices
else -> JvmPlatformAnalyzerServices/*TODO*/
}
@@ -36,33 +36,6 @@ val FirSession.firKtModuleBasedModuleData: LLFirKtModuleBasedModuleData
val FirBasedSymbol<*>.firModuleData: LLFirModuleData
get() = fir.firModuleData
class LLFirBuiltinsModuleData(
override val platform: TargetPlatform,
override val analyzerServices: PlatformDependentAnalyzerServices
) : LLFirModuleData() {
override val name: Name
get() = Name.special("<builtins for $platform>")
override val dependencies: List<FirModuleData> get() = emptyList()
override val dependsOnDependencies: List<FirModuleData> get() = emptyList()
override val friendDependencies: List<FirModuleData> get() = emptyList()
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as LLFirBuiltinsModuleData
if (platform != other.platform) return false
return true
}
override fun hashCode(): Int {
return platform.hashCode()
}
}
class LLFirKtModuleBasedModuleData(
val ktModule: KtModule,
@@ -7,15 +7,11 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.Immutable
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.ModuleFileCache
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirBuiltinsModuleData
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirKtModuleBasedModuleData
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.NoCacheForModuleException
import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionProvider
@Immutable
@@ -28,7 +24,6 @@ class LLFirSessionProvider internal constructor(
override fun getSession(moduleData: FirModuleData): LLFirSession {
requireIsInstance<LLFirModuleData>(moduleData)
return when (moduleData) {
is LLFirBuiltinsModuleData -> moduleData.session as LLFirBuiltinsAndCloneableSession
is LLFirKtModuleBasedModuleData -> getSession(moduleData.ktModule)
}
}
@@ -58,9 +58,6 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
return KtModuleProjectStructure(
mainModules = mainModules,
binaryModules = mainModules.asSequence().flatMap { it.ktModule.allDirectDependenciesOfType<KtLibraryModule>() }.asIterable(),
stdlibFor = { platform ->
createFakeStdlibModule(platform, project)
}
)
}
@@ -74,7 +71,6 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
project = project,
binaryRoots = emptyList(),
librarySources = null,
isBuitinsContainingStdlib = true
)
override fun doOutOfBlockModification(file: KtFile) {