diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt index 9cb2cbb9d4a..1e78bc11f00 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerBase.kt @@ -96,6 +96,9 @@ open class KJvmReplCompilerBase( if (messageCollector.hasErrors()) return failure(messageCollector) + // TODO: support case then JvmDependencyFromClassLoader is registered in non-first line + // registerPackageFragmentProvidersIfNeeded already tries to avoid duplicated registering, but impact on + // executing it on every snippet needs to be evaluated first if (state.history.isEmpty()) { val updatedConfiguration = ScriptDependenciesProvider.getInstance(context.environment.project) ?.getScriptConfiguration(snippetKtFile)?.configuration diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt index f07d2d852d7..9199bbf227d 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/ScriptJvmCompilerImpls.kt @@ -159,9 +159,17 @@ internal fun registerPackageFragmentProvidersIfNeeded( scriptCompilationConfiguration: ScriptCompilationConfiguration, environment: KotlinCoreEnvironment ) { - scriptCompilationConfiguration[ScriptCompilationConfiguration.dependencies]?.forEach { dependency -> - if (dependency is JvmDependencyFromClassLoader) { - // TODO: consider implementing deduplication + val scriptDependencies = scriptCompilationConfiguration[ScriptCompilationConfiguration.dependencies] ?: return + val scriptDependenciesFromClassLoader = scriptDependencies.filterIsInstance().takeIf { it.isNotEmpty() } + ?: return + // TODO: consider implementing deduplication/diff processing + val alreadyRegistered = + environment.project.extensionArea.getExtensionPoint(PackageFragmentProviderExtension.extensionPointName).extensions.any { + (it is PackageFragmentFromClassLoaderProviderExtension) && + it.scriptCompilationConfiguration[ScriptCompilationConfiguration.dependencies] == scriptDependencies + } + if (!alreadyRegistered) { + scriptDependenciesFromClassLoader.forEach { dependency -> PackageFragmentProviderExtension.registerExtension( environment.project, PackageFragmentFromClassLoaderProviderExtension(