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 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.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptConfiguratorExtensionImpl import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptConfiguratorExtensionImpl
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptDefinitionProviderService import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptDefinitionProviderService
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition 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.ScriptDefinitionsSource
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import kotlin.script.experimental.host.ScriptingHostConfiguration 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]. * [org.jetbrains.kotlin.config.CompilerConfiguration] replaced with a pair of explicit [scriptDefinitionSources] and [scriptDefinitions].
*/ */
internal class FirScriptingCompilerExtensionIdeRegistrar( internal class FirScriptingCompilerExtensionIdeRegistrar(
private val project: Project,
private val hostConfiguration: ScriptingHostConfiguration, private val hostConfiguration: ScriptingHostConfiguration,
private val scriptDefinitionSources: List<ScriptDefinitionsSource>, private val scriptDefinitionSources: List<ScriptDefinitionsSource>,
private val scriptDefinitions: List<ScriptDefinition> private val scriptDefinitions: List<ScriptDefinition>
@@ -27,7 +31,11 @@ internal class FirScriptingCompilerExtensionIdeRegistrar(
val definitionSources = scriptDefinitionSources val definitionSources = scriptDefinitionSources
val definitions = scriptDefinitions val definitions = scriptDefinitions
if (definitionSources.isNotEmpty() || definitions.isNotEmpty()) { if (definitionSources.isNotEmpty() || definitions.isNotEmpty()) {
+FirScriptDefinitionProviderService.getFactory(definitions, definitionSources) +FirScriptDefinitionProviderService.getFactory(
definitions, definitionSources,
ScriptDefinitionProvider.getInstance(project),
ScriptDependenciesProvider.getInstance(project)
)
} }
+FirScriptConfiguratorExtensionImpl.getFactory(hostConfiguration) +FirScriptConfiguratorExtensionImpl.getFactory(hostConfiguration)
@@ -128,6 +128,7 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
?: error("Cannot load script definition for ${module.file.virtualFilePath}") ?: error("Cannot load script definition for ${module.file.virtualFilePath}")
val extensionRegistrar = FirScriptingCompilerExtensionIdeRegistrar( val extensionRegistrar = FirScriptingCompilerExtensionIdeRegistrar(
project,
hostConfiguration, hostConfiguration,
scriptDefinitionSources = emptyList(), scriptDefinitionSources = emptyList(),
scriptDefinitions = listOf(scriptDefinition) scriptDefinitions = listOf(scriptDefinition)
@@ -44,23 +44,25 @@ class FirScriptDefinitionProviderService(
companion object { companion object {
fun getFactory( fun getFactory(
definitions: List<ScriptDefinition>, definitions: List<ScriptDefinition>,
definitionSources: List<ScriptDefinitionsSource> definitionSources: List<ScriptDefinitionsSource>,
definitionProvider: ScriptDefinitionProvider? = null,
configurationProvider: ScriptDependenciesProvider? = null
): Factory { ): Factory {
return Factory { session -> val makeDefinitionsProvider = definitionProvider?.let { { it } }
FirScriptDefinitionProviderService( ?: {
session, CliScriptDefinitionProvider().also {
makeDefaultDefinitionProvider = { it.setScriptDefinitionsSources(definitionSources)
CliScriptDefinitionProvider().also { it.setScriptDefinitions(definitions)
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 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) }
} }
} }
} }