Move REPL implementations to the scripting compiler impl module

This commit is contained in:
Ilya Chernikov
2019-02-26 12:12:24 +01:00
parent 199b32cad7
commit 4f135a5fe5
48 changed files with 456 additions and 486 deletions
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.scripting.compiler.plugin
import com.intellij.core.JavaCoreProjectEnvironment
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.extensions.ShellExtension
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.scripting.repl.ReplFromTerminal
class JvmCliReplShellExtension : ShellExtension {
override fun isAccepted(arguments: CommonCompilerArguments): Boolean = true
override fun run(
arguments: CommonCompilerArguments,
configuration: CompilerConfiguration,
projectEnvironment: JavaCoreProjectEnvironment
): ExitCode {
ReplFromTerminal.run(projectEnvironment.parentDisposable, configuration)
return ExitCode.OK
}
}
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.scripting.compiler.plugin
import com.intellij.core.JavaCoreProjectEnvironment
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.extensions.ReplFactoryExtension
import org.jetbrains.kotlin.cli.common.repl.ReplCompiler
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.script.KotlinScriptDefinition
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate
import org.jetbrains.kotlin.scripting.repl.GenericReplCompiler
import java.io.File
import java.net.URLClassLoader
class JvmStandardReplFactoryExtension : ReplFactoryExtension {
override fun makeReplCompiler(
templateClassName: String,
templateClasspath: List<File>,
baseClassLoader: ClassLoader?,
configuration: CompilerConfiguration,
projectEnvironment: JavaCoreProjectEnvironment
): ReplCompiler = GenericReplCompiler(
projectEnvironment.parentDisposable,
makeScriptDefinition(templateClasspath, templateClassName, baseClassLoader),
configuration,
configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
)
private fun makeScriptDefinition(
templateClasspath: List<File>, templateClassName: String, baseClassLoader: ClassLoader?
): KotlinScriptDefinition = try {
val classloader = URLClassLoader(templateClasspath.map { it.toURI().toURL() }.toTypedArray(), baseClassLoader)
val cls = classloader.loadClass(templateClassName)
KotlinScriptDefinitionFromAnnotatedTemplate(cls.kotlin, emptyMap())
} catch (ex: ClassNotFoundException) {
throw IllegalStateException("Cannot find script definition template class $templateClassName", ex)
} catch (ex: Exception) {
throw IllegalStateException("Error loading script definition template $templateClassName", ex)
}
}
@@ -7,11 +7,14 @@ package org.jetbrains.kotlin.scripting.compiler.plugin
import com.intellij.mock.MockProject
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.extensions.ReplFactoryExtension
import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension
import org.jetbrains.kotlin.cli.common.extensions.ShellExtension
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.extensions.CollectAdditionalSourcesExtension
import org.jetbrains.kotlin.extensions.CompilerConfigurationExtension
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
import org.jetbrains.kotlin.resolve.extensions.ExtraImportsProviderExtension
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
import org.jetbrains.kotlin.script.ScriptDefinitionProvider
@@ -23,11 +26,21 @@ import org.jetbrains.kotlin.scripting.legacy.CliScriptReportSink
import org.jetbrains.kotlin.scripting.shared.extensions.ScriptExtraImportsProviderExtension
import org.jetbrains.kotlin.scripting.shared.extensions.ScriptingResolveExtension
private fun <T> ProjectExtensionDescriptor<T>.registerExtensionIfRequired(project: MockProject, extension: T) {
try {
registerExtension(project, extension)
} catch (ex: IllegalArgumentException) {
// ignore
}
}
class ScriptingCompilerConfigurationComponentRegistrar : ComponentRegistrar {
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
CompilerConfigurationExtension.registerExtension(project, ScriptingCompilerConfigurationExtension(project))
CollectAdditionalSourcesExtension.registerExtension(project, ScriptingCollectAdditionalSourcesExtension(project))
ScriptEvaluationExtension.registerExtension(project, JvmCliScriptEvaluationExtension())
ScriptEvaluationExtension.registerExtensionIfRequired(project, JvmCliScriptEvaluationExtension())
ShellExtension.registerExtensionIfRequired(project, JvmCliReplShellExtension())
ReplFactoryExtension.registerExtensionIfRequired(project, JvmStandardReplFactoryExtension())
val scriptDefinitionProvider = CliScriptDefinitionProvider()
project.registerService(ScriptDefinitionProvider::class.java, scriptDefinitionProvider)