Pass script source directly instead of via configuration

This commit is contained in:
Ilya Chernikov
2018-03-27 20:12:44 +02:00
parent 29797ec264
commit 6ea41b425d
7 changed files with 27 additions and 17 deletions
@@ -8,6 +8,7 @@ package kotlin.script.experimental.api
interface ScriptCompiler {
suspend fun compile(
script: ScriptSource,
configuration: ScriptCompileConfiguration,
configurator: ScriptCompilationConfigurator? = null
): ResultWithDiagnostics<CompiledScript<*>>
@@ -29,9 +29,13 @@ abstract class BasicScriptingHost<ScriptBase : Any>(
) {
open fun <T> runInCoroutineContext(block: suspend CoroutineScope.() -> T): T = runBlocking { block() }
open fun eval(configuration: ScriptCompileConfiguration, environment: ScriptEvaluationEnvironment): ResultWithDiagnostics<EvaluationResult> =
open fun eval(
script: ScriptSource,
configuration: ScriptCompileConfiguration,
environment: ScriptEvaluationEnvironment
): ResultWithDiagnostics<EvaluationResult> =
runInCoroutineContext {
val compiled = compiler.compile(configuration, configurator)
val compiled = compiler.compile(script, configuration, configurator)
when (compiled) {
is ResultWithDiagnostics.Failure -> compiled
is ResultWithDiagnostics.Success -> {
@@ -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)