diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index b2b6cf1d9ea..8c2fc0b0e7d 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -93,7 +93,7 @@ class K2JsIrCompiler : CLICompiler() { configuration.put(CommonConfigurationKeys.MODULE_NAME, "repl.kts") val environment = KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(rootDisposable, configuration) - val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(rootDisposable, environment) + val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(rootDisposable, environment, configuration) projectEnv.registerExtensionsFromPlugins(configuration) val scriptingEvaluators = ScriptEvaluationExtension.getInstances(projectEnv.project) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt index b0ac901569b..c8632cadea5 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -89,7 +89,8 @@ class K2JVMCompiler : CLICompiler() { val projectEnvironment = KotlinCoreEnvironment.ProjectEnvironment( rootDisposable, - KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(rootDisposable, configuration) + KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(rootDisposable, configuration), + configuration ) projectEnvironment.registerExtensionsFromPlugins(configuration) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 397d7609b40..73010f11dab 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -115,10 +115,47 @@ class KotlinCoreEnvironment private constructor( class ProjectEnvironment( disposable: Disposable, - applicationEnvironment: KotlinCoreApplicationEnvironment + applicationEnvironment: KotlinCoreApplicationEnvironment, + configuration: CompilerConfiguration ) : KotlinCoreProjectEnvironment(disposable, applicationEnvironment) { + internal val jarFileSystem: VirtualFileSystem + + init { + val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + + if (configuration.getBoolean(JVMConfigurationKeys.USE_FAST_JAR_FILE_SYSTEM)) { + messageCollector?.report( + STRONG_WARNING, + "Using new faster version of JAR FS: it should make your build faster, but the new implementation is experimental" + ) + } + + jarFileSystem = when { + configuration.getBoolean(JVMConfigurationKeys.USE_FAST_JAR_FILE_SYSTEM) || configuration.getBoolean(CommonConfigurationKeys.USE_FIR) -> { + val fastJarFs = FastJarFileSystem.createIfUnmappingPossible() + + if (fastJarFs == null) { + messageCollector?.report( + STRONG_WARNING, + "Your JDK doesn't seem to support mapped buffer unmapping, so the slower (old) version of JAR FS will be used" + ) + applicationEnvironment.jarFileSystem + } else { + + Disposer.register(disposable) { + fastJarFs.clearHandlersCache() + } + + fastJarFs + } + } + + else -> applicationEnvironment.jarFileSystem + } + } + private var extensionRegistered = false override fun preregisterServices() { @@ -159,7 +196,8 @@ class KotlinCoreEnvironment private constructor( val configuration: CompilerConfiguration = initialConfiguration.apply { setupJdkClasspathRoots(configFiles) }.copy() - private val jarFileSystem: VirtualFileSystem + private val jarFileSystem: VirtualFileSystem = + (projectEnvironment as? ProjectEnvironment)?.jarFileSystem ?: applicationEnvironment.jarFileSystem init { PersistentFSConstants::class.java.getDeclaredField("ourMaxIntellisenseFileSize") @@ -177,24 +215,6 @@ class KotlinCoreEnvironment private constructor( ) } - jarFileSystem = when { - configuration.getBoolean(JVMConfigurationKeys.USE_FAST_JAR_FILE_SYSTEM) || configuration.getBoolean(CommonConfigurationKeys.USE_FIR) -> { - val fastJarFs = FastJarFileSystem.createIfUnmappingPossible() - - if (fastJarFs == null) { - messageCollector?.report( - STRONG_WARNING, - "Your JDK doesn't seem to support mapped buffer unmapping, so the slower (old) version of JAR FS will be used" - ) - applicationEnvironment.jarFileSystem - } else { - fastJarFs - } - } - - else -> applicationEnvironment.jarFileSystem - } - (projectEnvironment as? ProjectEnvironment)?.registerExtensionsFromPlugins(configuration) // otherwise consider that project environment is properly configured before passing to the environment // TODO: consider some asserts to check important extension points @@ -455,7 +475,7 @@ class KotlinCoreEnvironment private constructor( ): KotlinCoreEnvironment { setupIdeaStandaloneExecution() val appEnv = getOrCreateApplicationEnvironmentForProduction(parentDisposable, configuration) - val projectEnv = ProjectEnvironment(parentDisposable, appEnv) + val projectEnv = ProjectEnvironment(parentDisposable, appEnv, configuration) val environment = KotlinCoreEnvironment(projectEnv, configuration, configFiles) synchronized(APPLICATION_LOCK) { @@ -487,7 +507,7 @@ class KotlinCoreEnvironment private constructor( val configuration = initialConfiguration.copy() // Tests are supposed to create a single project and dispose it right after use val appEnv = createApplicationEnvironment(parentDisposable, configuration, unitTestMode = true) - val projectEnv = ProjectEnvironment(parentDisposable, appEnv) + val projectEnv = ProjectEnvironment(parentDisposable, appEnv, configuration) return KotlinCoreEnvironment(projectEnv, configuration, extensionConfigs) } @@ -502,7 +522,7 @@ class KotlinCoreEnvironment private constructor( @TestOnly fun createProjectEnvironmentForTests(parentDisposable: Disposable, configuration: CompilerConfiguration): ProjectEnvironment { val appEnv = createApplicationEnvironment(parentDisposable, configuration, unitTestMode = true) - return ProjectEnvironment(parentDisposable, appEnv) + return ProjectEnvironment(parentDisposable, appEnv, configuration) } // used in the daemon for jar cache cleanup @@ -557,7 +577,6 @@ class KotlinCoreEnvironment private constructor( ourApplicationEnvironment = null Disposer.dispose(environment.parentDisposable) ZipHandler.clearFileAccessorCache() - (environment.jarFileSystem as? FastJarFileSystem)?.clearHandlersCache() } } diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index 10de14ebef6..e04ebf0b397 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -1204,7 +1204,6 @@ class CompileServiceImpl( override fun clearJarCache() { ZipHandler.clearFileAccessorCache() (KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? CoreJarFileSystem)?.clearHandlersCache() - (KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? FastJarFileSystem)?.clearHandlersCache() } private inline fun ifAlive( diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt index 6657cf3b2e2..0e6c352c28b 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt @@ -66,7 +66,8 @@ abstract class KotlinJvmReplServiceBase( val projectEnvironment = KotlinCoreEnvironment.ProjectEnvironment( disposable, - KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(disposable, configuration) + KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForProduction(disposable, configuration), + configuration, ) ReplFactoryExtension.registerExtensionPoint(projectEnvironment.project) projectEnvironment.registerExtensionsFromPlugins(configuration) @@ -223,4 +224,4 @@ fun CompilerConfiguration.configureScripting(compilerId: CompilerId) { error ) } -} \ No newline at end of file +} diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/experimental/CompileServiceServerSideImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/experimental/CompileServiceServerSideImpl.kt index 9a048703269..d04fdb4a38d 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/experimental/CompileServiceServerSideImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/experimental/CompileServiceServerSideImpl.kt @@ -670,7 +670,6 @@ class CompileServiceServerSideImpl( override suspend fun clearJarCache() { ZipHandler.clearFileAccessorCache() (KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? CoreJarFileSystem)?.clearHandlersCache() - (KotlinCoreEnvironment.applicationEnvironment?.jarFileSystem as? FastJarFileSystem)?.clearHandlersCache() } private suspend fun ifAlive( diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt index 50a8bbd49ce..26d3bb50bfd 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt @@ -84,12 +84,13 @@ open class CompilerConfigurationProviderImpl( ApplicationEnvironmentDisposer.ROOT_DISPOSABLE, CompilerConfiguration() ) - val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(testRootDisposable, applicationEnvironment) + val initialConfiguration = createCompilerConfiguration(module) + val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(testRootDisposable, applicationEnvironment, initialConfiguration) val project = projectEnv.project configurators.forEach { it.registerCompilerExtensions(project) } return KotlinCoreEnvironment.createForTests( projectEnv, - createCompilerConfiguration(module), + initialConfiguration, configFiles ) }