KT-60171 K2-scripting: CLI specific providers are used in IDE context

^KT-60171 fixed

Merge-request: KT-MR-10987
Merged-by: Andrei Klunnyi <andrei.klunnyi@jetbrains.com>
This commit is contained in:
Andrei Klunnyi
2023-07-10 11:03:11 +00:00
committed by Space Team
parent 19ccb23088
commit 527d20c7be
3 changed files with 27 additions and 16 deletions
@@ -5,11 +5,14 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptConfiguratorExtensionImpl
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptDefinitionProviderService
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import kotlin.script.experimental.host.ScriptingHostConfiguration
/**
@@ -18,6 +21,7 @@ import kotlin.script.experimental.host.ScriptingHostConfiguration
* [org.jetbrains.kotlin.config.CompilerConfiguration] replaced with a pair of explicit [scriptDefinitionSources] and [scriptDefinitions].
*/
internal class FirScriptingCompilerExtensionIdeRegistrar(
private val project: Project,
private val hostConfiguration: ScriptingHostConfiguration,
private val scriptDefinitionSources: List<ScriptDefinitionsSource>,
private val scriptDefinitions: List<ScriptDefinition>
@@ -27,7 +31,11 @@ internal class FirScriptingCompilerExtensionIdeRegistrar(
val definitionSources = scriptDefinitionSources
val definitions = scriptDefinitions
if (definitionSources.isNotEmpty() || definitions.isNotEmpty()) {
+FirScriptDefinitionProviderService.getFactory(definitions, definitionSources)
+FirScriptDefinitionProviderService.getFactory(
definitions, definitionSources,
ScriptDefinitionProvider.getInstance(project),
ScriptDependenciesProvider.getInstance(project)
)
}
+FirScriptConfiguratorExtensionImpl.getFactory(hostConfiguration)
@@ -128,6 +128,7 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
?: error("Cannot load script definition for ${module.file.virtualFilePath}")
val extensionRegistrar = FirScriptingCompilerExtensionIdeRegistrar(
project,
hostConfiguration,
scriptDefinitionSources = emptyList(),
scriptDefinitions = listOf(scriptDefinition)
@@ -44,23 +44,25 @@ class FirScriptDefinitionProviderService(
companion object {
fun getFactory(
definitions: List<ScriptDefinition>,
definitionSources: List<ScriptDefinitionsSource>
definitionSources: List<ScriptDefinitionsSource>,
definitionProvider: ScriptDefinitionProvider? = null,
configurationProvider: ScriptDependenciesProvider? = null
): Factory {
return Factory { session ->
FirScriptDefinitionProviderService(
session,
makeDefaultDefinitionProvider = {
CliScriptDefinitionProvider().also {
it.setScriptDefinitionsSources(definitionSources)
it.setScriptDefinitions(definitions)
}
},
makeDefaultConfigurationProvider = {
// TODO: check if memory can leak in MockProject (probably not too important, since currently the providers are set externaly in important cases)
CliScriptDependenciesProvider(MockProject(null, Disposer.newDisposable()))
val makeDefinitionsProvider = definitionProvider?.let { { it } }
?: {
CliScriptDefinitionProvider().also {
it.setScriptDefinitionsSources(definitionSources)
it.setScriptDefinitions(definitions)
}
)
}
}
val makeConfigurationProvider = configurationProvider?.let { { it } }
?: {
// TODO: check if memory can leak in MockProject (probably not too important, since currently the providers are set externaly in important cases)
CliScriptDependenciesProvider(MockProject(null, Disposer.newDisposable()))
}
return Factory { session -> FirScriptDefinitionProviderService(session, makeDefinitionsProvider, makeConfigurationProvider) }
}
}
}