From 6ea41b425d2e13c9df9d8831944e0cfe5b09470b Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 27 Mar 2018 20:12:44 +0200 Subject: [PATCH] Pass script source directly instead of via configuration --- .../examples/jvm/resolve/maven/host/host.kt | 2 +- .../script/examples/jvm/simple/host/host.kt | 2 +- .../script/experimental/api/scriptCompilation.kt | 1 + .../experimental/host/BasicScriptingHost.kt | 8 ++++++-- .../script/experimental/host/scriptHostUtil.kt | 13 ++++++------- .../experimental/jvmhost/impl/KJVMCompilerImpl.kt | 3 ++- .../experimental/jvm/jvmScriptCompilation.kt | 15 ++++++++++----- 7 files changed, 27 insertions(+), 17 deletions(-) diff --git a/libraries/examples/scripting/jvm-maven-deps/host/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/host/host.kt b/libraries/examples/scripting/jvm-maven-deps/host/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/host/host.kt index 6d41188051b..17f00f14fce 100644 --- a/libraries/examples/scripting/jvm-maven-deps/host/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/host/host.kt +++ b/libraries/examples/scripting/jvm-maven-deps/host/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/host/host.kt @@ -28,7 +28,7 @@ fun evalFile(scriptFile: File): ResultWithDiagnostics { scriptDefinition.evaluator ) - return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment()) + return host.eval(scriptFile.toScriptSource(), myJvmConfig(), ScriptEvaluationEnvironment()) } fun main(vararg args: String) { diff --git a/libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt b/libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt index ae5ac19087b..4d5d440e9a8 100644 --- a/libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt +++ b/libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt @@ -35,7 +35,7 @@ fun evalFile(scriptFile: File): ResultWithDiagnostics { scriptDefinition.evaluator ) - return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment()) + return host.eval(scriptFile.toScriptSource(), myJvmConfig(), ScriptEvaluationEnvironment()) } fun main(vararg args: String) { diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt index a23b8f9398a..a6e9fe8dd9e 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt @@ -8,6 +8,7 @@ package kotlin.script.experimental.api interface ScriptCompiler { suspend fun compile( + script: ScriptSource, configuration: ScriptCompileConfiguration, configurator: ScriptCompilationConfigurator? = null ): ResultWithDiagnostics> diff --git a/libraries/scripting/common/src/kotlin/script/experimental/host/BasicScriptingHost.kt b/libraries/scripting/common/src/kotlin/script/experimental/host/BasicScriptingHost.kt index e3726e9b082..0298e86ca55 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/host/BasicScriptingHost.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/host/BasicScriptingHost.kt @@ -29,9 +29,13 @@ abstract class BasicScriptingHost( ) { open fun runInCoroutineContext(block: suspend CoroutineScope.() -> T): T = runBlocking { block() } - open fun eval(configuration: ScriptCompileConfiguration, environment: ScriptEvaluationEnvironment): ResultWithDiagnostics = + open fun eval( + script: ScriptSource, + configuration: ScriptCompileConfiguration, + environment: ScriptEvaluationEnvironment + ): ResultWithDiagnostics = runInCoroutineContext { - val compiled = compiler.compile(configuration, configurator) + val compiled = compiler.compile(script, configuration, configurator) when (compiled) { is ResultWithDiagnostics.Failure -> compiled is ResultWithDiagnostics.Success -> { diff --git a/libraries/scripting/common/src/kotlin/script/experimental/host/scriptHostUtil.kt b/libraries/scripting/common/src/kotlin/script/experimental/host/scriptHostUtil.kt index b8c2eb448b5..cda9290f615 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/host/scriptHostUtil.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/host/scriptHostUtil.kt @@ -5,11 +5,9 @@ package kotlin.script.experimental.host -import kotlin.script.experimental.api.ScriptSource -import kotlin.script.experimental.api.ScriptSourceFragments -import kotlin.script.experimental.api.ScriptSourceNamedFragment import java.io.File import java.net.URL +import kotlin.script.experimental.api.* fun ScriptSourceFragments.isWholeFile(): Boolean = fragments?.isEmpty() ?: true @@ -20,14 +18,15 @@ fun ScriptSource.getScriptText(): String = when { else -> throw RuntimeException("unable to get text from null script") } -fun ScriptSourceFragments.getMergedScriptText(): String { - val originalScriptText = originalSource.getScriptText() - return if (isWholeFile()) { +fun getMergedScriptText(script: ScriptSource, configuration: ScriptCompileConfiguration): String { + val originalScriptText = script.getScriptText() + val sourceFragments = configuration.getOrNull(ScriptCompileConfigurationParams.scriptSourceFragments) + return if (sourceFragments == null || sourceFragments.isWholeFile()) { originalScriptText } else { val sb = StringBuilder(originalScriptText.length) var prevFragment: ScriptSourceNamedFragment? = null - for (fragment in fragments!!) { + for (fragment in sourceFragments!!.fragments!!) { val fragmentStartPos = fragment.range.start.absolutePos val fragmentEndPos = fragment.range.end.absolutePos if (fragmentStartPos == null || fragmentEndPos == null) diff --git a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/impl/KJVMCompilerImpl.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/impl/KJVMCompilerImpl.kt index 7f9dfb56c22..91ddc76541d 100644 --- a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/impl/KJVMCompilerImpl.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/impl/KJVMCompilerImpl.kt @@ -69,6 +69,7 @@ class KJVMCompiledScript( class KJVMCompilerImpl : KJVMCompilerProxy { override fun compile( + script: ScriptSource, scriptCompilerConfiguration: ScriptCompileConfiguration, configurator: ScriptCompilationConfigurator? ): ResultWithDiagnostics> { @@ -147,7 +148,7 @@ class KJVMCompilerImpl : KJVMCompilerProxy { val analyzerWithCompilerReport = AnalyzerWithCompilerReport(messageCollector, environment.configuration.languageVersionSettings) val psiFileFactory: PsiFileFactoryImpl = PsiFileFactory.getInstance(environment.project) as PsiFileFactoryImpl - val scriptText = scriptCompilerConfiguration[ScriptCompileConfigurationParams.scriptSourceFragments].getMergedScriptText() + val scriptText = getMergedScriptText(script, scriptCompilerConfiguration) val scriptFileName = "script" // TODO: extract from file/url if available val virtualFile = LightVirtualFile( "$scriptFileName${KotlinParserDefinition.STD_SCRIPT_EXT}", diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt index 3e3b5c01781..d59199fd79b 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt @@ -14,7 +14,11 @@ open class JvmScriptCompiler( val cache: CompiledJvmScriptsCache ) : ScriptCompiler { - override suspend fun compile(configuration: ScriptCompileConfiguration, configurator: ScriptCompilationConfigurator?): ResultWithDiagnostics> { + override suspend fun compile( + script: ScriptSource, + configuration: ScriptCompileConfiguration, + configurator: ScriptCompilationConfigurator? + ): ResultWithDiagnostics> { val refinedConfiguration = configurator?.refineConfiguration(configuration)?.let { when (it) { is ResultWithDiagnostics.Failure -> return it @@ -22,11 +26,11 @@ open class JvmScriptCompiler( ?: return ResultWithDiagnostics.Failure("Null script compile configuration received".asErrorDiagnostics()) } } ?: configuration - val cached = cache[refinedConfiguration[ScriptCompileConfigurationParams.scriptSourceFragments]] + val cached = cache.get(script, refinedConfiguration) if (cached != null) return cached.asSuccess() - return compilerProxy.compile(refinedConfiguration, configurator).also { + return compilerProxy.compile(script, refinedConfiguration, configurator).also { if (it is ResultWithDiagnostics.Success) { cache.store(it.value as CompiledScript<*>) } @@ -35,19 +39,20 @@ open class JvmScriptCompiler( } interface CompiledJvmScriptsCache { - operator fun get(script: ScriptSourceFragments): CompiledScript<*>? + fun get(script: ScriptSource, configuration: ScriptCompileConfiguration): CompiledScript<*>? fun store(compiledScript: CompiledScript<*>) } interface KJVMCompilerProxy { fun compile( + script: ScriptSource, scriptCompilerConfiguration: ScriptCompileConfiguration, configurator: ScriptCompilationConfigurator? ): ResultWithDiagnostics> } class DummyCompiledJvmScriptCache : CompiledJvmScriptsCache { - override operator fun get(script: ScriptSourceFragments): CompiledScript<*>? = null + override fun get(script: ScriptSource, configuration: ScriptCompileConfiguration): CompiledScript<*>? = null override fun store(compiledScript: CompiledScript<*>) {} }