From 67e431679d35559cfb1ecb9495648dfbafeefb53 Mon Sep 17 00:00:00 2001 From: MEFRREEX Date: Tue, 19 Aug 2025 13:40:55 +0400 Subject: [PATCH] feat: added support for Script#addExtraScript --- build.gradle.kts | 4 ++-- .../scriptify/kts/script/KtsScript.kt | 19 +++++++++++++----- .../kts/script/bridge/KtsPreludeBuilder.kt | 20 ++++++++++++++++++- .../KtsScriptEvaluationConfiguration.kt | 10 +++++----- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f1c1363..87bc3e0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "com.instancify.scriptify.kts" -version = "1.0.0-SNAPSHOT" +version = "1.0.1-SNAPSHOT" repositories { mavenCentral() @@ -13,7 +13,7 @@ repositories { } dependencies { - compileOnlyApi("com.instancify.scriptify:core:1.4.2-SNAPSHOT") + compileOnlyApi("com.instancify.scriptify:core:1.4.4-SNAPSHOT") compileOnlyApi("org.jetbrains.kotlin:kotlin-scripting-common:2.2.10") compileOnlyApi("org.jetbrains.kotlin:kotlin-scripting-jvm:2.2.10") compileOnlyApi("org.jetbrains.kotlin:kotlin-scripting-jvm-host:2.2.10") diff --git a/src/main/kotlin/com/instancify/scriptify/kts/script/KtsScript.kt b/src/main/kotlin/com/instancify/scriptify/kts/script/KtsScript.kt index 536d457..0250636 100644 --- a/src/main/kotlin/com/instancify/scriptify/kts/script/KtsScript.kt +++ b/src/main/kotlin/com/instancify/scriptify/kts/script/KtsScript.kt @@ -24,6 +24,7 @@ class KtsScript : Script { private val securityManager: ScriptSecurityManager = StandardSecurityManager() private var functionManager: ScriptFunctionManager = StandardFunctionManager() private var constantManager: ScriptConstantManager = StandardConstantManager() + private val extraScript = mutableListOf() override fun getSecurityManager() = securityManager @@ -39,18 +40,27 @@ class KtsScript : Script { this.constantManager = constantManager } + override fun addExtraScript(script: String) { + extraScript.add(script) + } + @Throws(ScriptException::class) override fun eval(script: String): EvaluationResult? { val host = BasicJvmScriptingHost() val bridge = KtsBridge(this) - val source = StringScriptSource(KtsPreludeBuilder.build(this, script)) + val source = StringScriptSource(KtsPreludeBuilder.build(this, buildString { + // Building full script including extra script code + for (extra in extraScript) { + append("$extra\n") + } + append(script) + })) + val result = host.eval( source, KtsScriptCompilationConfiguration(securityManager), - KtsScriptEvaluationConfiguration.with { - providedProperties(mapOf("__bridge__" to bridge)) - } + KtsScriptEvaluationConfiguration(bridge) ) if (result is ResultWithDiagnostics.Success) { @@ -71,5 +81,4 @@ class KtsScript : Script { } return null } - } \ No newline at end of file diff --git a/src/main/kotlin/com/instancify/scriptify/kts/script/bridge/KtsPreludeBuilder.kt b/src/main/kotlin/com/instancify/scriptify/kts/script/bridge/KtsPreludeBuilder.kt index 2e7ea0d..01bc18c 100644 --- a/src/main/kotlin/com/instancify/scriptify/kts/script/bridge/KtsPreludeBuilder.kt +++ b/src/main/kotlin/com/instancify/scriptify/kts/script/bridge/KtsPreludeBuilder.kt @@ -16,6 +16,22 @@ object KtsPreludeBuilder { fun build(script: KtsScript, scriptCode: String): String { val sb = StringBuilder() + // split the script into lines (package, imports, code) + val lines = scriptCode.lines() + val packageLine = lines.firstOrNull { it.trim().startsWith("package ") } + val imports = lines.filter { it.trim().startsWith("import ") } + val body = lines.filterNot { it.trim().startsWith("import ") || it.trim().startsWith("package ") } + + packageLine?.let { + sb.append(it).append("\n\n") + } + + imports.forEach { sb.append(it).append("\n") } + if (imports.isNotEmpty()) { + sb.append("\n") + } + + // adding constants for (constant in script.constantManager.constants.values) { val name = constant.name val type = constant.value?.let { @@ -26,6 +42,7 @@ object KtsPreludeBuilder { sb.append("\n") + // adding functions for (definition in script.functionManager.functions.values) { val name = definition.function.name for (executor in definition.executors) { @@ -36,8 +53,9 @@ object KtsPreludeBuilder { } } + // adding other script code sb.append("\n\n") - sb.append(scriptCode) + body.forEach { sb.append(it).append("\n") } return sb.toString() } diff --git a/src/main/kotlin/com/instancify/scriptify/kts/script/configuration/KtsScriptEvaluationConfiguration.kt b/src/main/kotlin/com/instancify/scriptify/kts/script/configuration/KtsScriptEvaluationConfiguration.kt index 6a15adc..b41302c 100644 --- a/src/main/kotlin/com/instancify/scriptify/kts/script/configuration/KtsScriptEvaluationConfiguration.kt +++ b/src/main/kotlin/com/instancify/scriptify/kts/script/configuration/KtsScriptEvaluationConfiguration.kt @@ -1,9 +1,9 @@ package com.instancify.scriptify.kts.script.configuration +import com.instancify.scriptify.kts.script.bridge.KtsBridge import kotlin.script.experimental.api.ScriptEvaluationConfiguration +import kotlin.script.experimental.api.providedProperties -object KtsScriptEvaluationConfiguration : ScriptEvaluationConfiguration({ - -}) { - private fun readResolve(): Any = KtsScriptEvaluationConfiguration -} \ No newline at end of file +class KtsScriptEvaluationConfiguration(bridge: KtsBridge) : ScriptEvaluationConfiguration({ + providedProperties(mapOf("__bridge__" to bridge)) +}) \ No newline at end of file