[FIR] Extract createFirLibraryListAndSession to cliCompilerUtils

Use it in compilerPipeline and FirKotlinToJvmBytecodeCompiler
This commit is contained in:
Ivan Kochurkin
2023-01-16 21:25:49 +01:00
committed by Space Team
parent 1edc9f0a1d
commit 5f1ed56554
4 changed files with 67 additions and 69 deletions
@@ -20,8 +20,6 @@ import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.STRONG_WARNING
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots
import org.jetbrains.kotlin.codegen.ClassBuilderFactories
import org.jetbrains.kotlin.codegen.CodegenFactory
import org.jetbrains.kotlin.codegen.state.GenerationState
@@ -211,7 +209,10 @@ object FirKotlinToJvmBytecodeCompiler {
val sessionProvider = FirProjectSessionProvider()
val moduleName = module.getModuleName()
val libraryList = createLibraryListAndSession(moduleName, sessionProvider, librariesScope, languageVersionSettings)
val libraryList = createFirLibraryListAndSession(
moduleName, moduleConfiguration, projectEnvironment,
scope = librariesScope, librariesScope = librariesScope, friendPaths = module.getFriendPaths(), sessionProvider
)
val commonModuleData = runIf(isMppEnabled) {
FirModuleDataImpl(
@@ -293,36 +294,6 @@ object FirKotlinToJvmBytecodeCompiler {
return if (syntaxErrors || diagnosticsReporter.hasErrors) null else FirResult(platformOutput, commonOutput)
}
private fun CompilationContext.createLibraryListAndSession(
moduleName: String,
sessionProvider: FirProjectSessionProvider,
librariesScope: AbstractProjectFileSearchScope,
languageVersionSettings: LanguageVersionSettings
): DependencyListForCliModule {
val binaryModuleData = BinaryModuleData.initialize(
Name.identifier(moduleName),
JvmPlatforms.unspecifiedJvmPlatform,
JvmPlatformAnalyzerServices
)
val libraryList = DependencyListForCliModule.build(binaryModuleData) {
dependencies(moduleConfiguration.jvmClasspathRoots.map { it.toPath() })
dependencies(moduleConfiguration.jvmModularRoots.map { it.toPath() })
friendDependencies(moduleConfiguration[JVMConfigurationKeys.FRIEND_PATHS] ?: emptyList())
friendDependencies(module.getFriendPaths())
}
FirJvmSessionFactory.createLibrarySession(
Name.identifier(moduleName),
sessionProvider,
libraryList.moduleDataProvider,
projectEnvironment,
librariesScope,
projectEnvironment.getPackagePartProvider(librariesScope),
languageVersionSettings,
registerExtraComponents = {},
)
return libraryList
}
private fun buildResolveAndCheckFir(
session: FirSession,
ktFiles: List<KtFile>,
@@ -19,18 +19,30 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
import org.jetbrains.kotlin.cli.common.modules.ModuleBuilder
import org.jetbrains.kotlin.cli.common.output.writeAll
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.GenerationStateEventCallback
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.fir.BinaryModuleData
import org.jetbrains.kotlin.fir.DependencyListForCliModule
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.session.FirJvmSessionFactory
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope
import org.jetbrains.kotlin.javac.JavacWrapper
import org.jetbrains.kotlin.modules.JavaRootPath
import org.jetbrains.kotlin.modules.Module
import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
import java.io.File
fun Module.getSourceFiles(
@@ -184,3 +196,36 @@ fun ModuleBuilder.configureFromArgs(args: K2JVMCompilerArguments) {
}
}
fun createFirLibraryListAndSession(
moduleName: String,
configuration: CompilerConfiguration,
projectEnvironment: AbstractProjectEnvironment,
scope: AbstractProjectFileSearchScope,
librariesScope: AbstractProjectFileSearchScope,
friendPaths: List<String>,
sessionProvider: FirProjectSessionProvider
): DependencyListForCliModule {
val binaryModuleData = BinaryModuleData.initialize(
Name.identifier(moduleName),
JvmPlatforms.unspecifiedJvmPlatform,
JvmPlatformAnalyzerServices
)
val libraryList = DependencyListForCliModule.build(binaryModuleData) {
dependencies(configuration.jvmClasspathRoots.map { it.toPath() })
dependencies(configuration.jvmModularRoots.map { it.toPath() })
friendDependencies(configuration[JVMConfigurationKeys.FRIEND_PATHS] ?: emptyList())
friendDependencies(friendPaths)
}
FirJvmSessionFactory.createLibrarySession(
Name.identifier(moduleName),
sessionProvider,
libraryList.moduleDataProvider,
projectEnvironment,
scope,
projectEnvironment.getPackagePartProvider(librariesScope),
configuration.languageVersionSettings,
registerExtraComponents = {},
)
return libraryList
}
@@ -43,8 +43,6 @@ import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.BinaryModuleData
import org.jetbrains.kotlin.fir.DependencyListForCliModule
import org.jetbrains.kotlin.fir.FirModuleDataImpl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
@@ -338,7 +336,13 @@ fun compileModuleToAnalyzedFir(
val sessionProvider = FirProjectSessionProvider()
val moduleName = input.targetId.name
val libraryList = createLibraryListAndSession(moduleName, input.configuration, projectEnvironment, librariesScope, sessionProvider)
val libraryList = createFirLibraryListAndSession(
moduleName, input.configuration, projectEnvironment,
scope = projectEnvironment.getSearchScopeForProjectLibraries(),
librariesScope = librariesScope,
friendPaths = emptyList(),
sessionProvider
)
val commonModuleData = runIf(isMppEnabled) {
FirModuleDataImpl(
@@ -409,36 +413,6 @@ fun compileModuleToAnalyzedFir(
return FirResult(platformOutput, commonOutput)
}
fun createLibraryListAndSession(
moduleName: String,
configuration: CompilerConfiguration,
projectEnvironment: AbstractProjectEnvironment,
librariesScope: AbstractProjectFileSearchScope,
sessionProvider: FirProjectSessionProvider
): DependencyListForCliModule {
val binaryModuleData = BinaryModuleData.initialize(
Name.identifier(moduleName),
JvmPlatforms.unspecifiedJvmPlatform,
JvmPlatformAnalyzerServices
)
val libraryList = DependencyListForCliModule.build(binaryModuleData) {
dependencies(configuration.jvmClasspathRoots.map { it.toPath() })
dependencies(configuration.jvmModularRoots.map { it.toPath() })
friendDependencies(configuration[JVMConfigurationKeys.FRIEND_PATHS] ?: emptyList())
}
FirJvmSessionFactory.createLibrarySession(
Name.identifier(moduleName),
sessionProvider,
libraryList.moduleDataProvider,
projectEnvironment,
projectEnvironment.getSearchScopeForProjectLibraries(),
projectEnvironment.getPackagePartProvider(librariesScope),
configuration.languageVersionSettings,
registerExtraComponents = {},
)
return libraryList
}
private fun buildResolveAndCheckFir(
session: FirSession,
ktFiles: Collection<KtSourceFile>,
@@ -31,8 +31,10 @@ import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.pipeline.*
import org.jetbrains.kotlin.fir.session.FirJvmSessionFactory
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.CommonPlatforms
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.psi.KtFile
@@ -50,8 +52,6 @@ import kotlin.script.experimental.jvm.JvmDependencyFromClassLoader
import kotlin.script.experimental.jvm.compilationCache
import kotlin.script.experimental.jvm.impl.KJvmCompiledScript
import kotlin.script.experimental.jvm.jvm
import org.jetbrains.kotlin.fir.session.FirJvmSessionFactory
import org.jetbrains.kotlin.name.Name
class ScriptJvmCompilerIsolated(val hostConfiguration: ScriptingHostConfiguration) : ScriptCompilerProxy {
@@ -359,7 +359,15 @@ private fun doCompileWithK2(
)?.also { (_, _, precompiledBinariesFileScope) ->
precompiledBinariesFileScope?.let { librariesScope -= it }
}
val libraryList = createLibraryListAndSession(targetId.name, kotlinCompilerConfiguration, projectEnvironment, librariesScope, sessionProvider)
val libraryList = createFirLibraryListAndSession(
targetId.name,
kotlinCompilerConfiguration,
projectEnvironment,
scope = projectEnvironment.getSearchScopeForProjectLibraries(),
librariesScope = librariesScope,
friendPaths = emptyList(),
sessionProvider
)
val moduleData = FirModuleDataImpl(
Name.identifier(targetId.name),
libraryList.regularDependencies,