Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ plugins {
}

group = "com.instancify.scriptify.kts"
version = "1.0.0-SNAPSHOT"
version = "1.0.1-SNAPSHOT"

repositories {
mavenCentral()
maven("https://repo.instancify.app/snapshots")
}

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")
Expand Down
19 changes: 14 additions & 5 deletions src/main/kotlin/com/instancify/scriptify/kts/script/KtsScript.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class KtsScript : Script<EvaluationResult?> {
private val securityManager: ScriptSecurityManager = StandardSecurityManager()
private var functionManager: ScriptFunctionManager = StandardFunctionManager()
private var constantManager: ScriptConstantManager = StandardConstantManager()
private val extraScript = mutableListOf<String>()

override fun getSecurityManager() = securityManager

Expand All @@ -39,18 +40,27 @@ class KtsScript : Script<EvaluationResult?> {
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) {
Expand All @@ -71,5 +81,4 @@ class KtsScript : Script<EvaluationResult?> {
}
return null
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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) {
Expand All @@ -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()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
class KtsScriptEvaluationConfiguration(bridge: KtsBridge) : ScriptEvaluationConfiguration({
providedProperties(mapOf("__bridge__" to bridge))
})