Skip to content
This repository was archived by the owner on Oct 3, 2021. It is now read-only.

Commit 68279b6

Browse files
author
Krystian Panek
committed
Closer...
1 parent 7e95780 commit 68279b6

File tree

3 files changed

+79
-9
lines changed

3 files changed

+79
-9
lines changed

build.gradle.kts

+5-5
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ dependencies {
4343
compileOnly("org.jetbrains.kotlin:kotlin-script-runtime:1.4.0")
4444
compileOnly("org.jetbrains.kotlin:kotlin-script-util:1.4.0")
4545
compileOnly("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.0")
46+
compileOnly("org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.4.0")
4647
compileOnly("org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.4.0") // runtime
4748

4849
compileOnly("com.adobe.aem:uber-jar:6.5.0:apis")
@@ -80,19 +81,18 @@ tasks {
8081
attribute("ScriptEngine-Version", "1.4")
8182

8283
// embed jsr
83-
attribute("Include-Resource", "kotlin-script-util-1.4.0.jar,kotlin-script-runtime-1.4.0.jar,kotlin-scripting-compiler-embeddable-1.4.0.jar,/Users/krystian.panek/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-scripting-compiler-impl-embeddable/1.4.0/b2446c3e97bc1aeb4c5e5565c25393f377827aca/kotlin-scripting-compiler-impl-embeddable-1.4.0.jar")
84-
attribute("Bundle-ClassPath", ".,kotlin-script-util-1.4.0.jar,kotlin-script-runtime-1.4.0.jar,kotlin-scripting-compiler-embeddable-1.4.0.jar,kotlin-scripting-compiler-impl-embeddable-1.4.0.jar")
84+
attribute("Include-Resource", "kotlin-script-util-1.4.0.jar,kotlin-script-runtime-1.4.0.jar,kotlin-scripting-compiler-embeddable-1.4.0.jar,/Users/krystian.panek/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-scripting-compiler-impl-embeddable/1.4.0/b2446c3e97bc1aeb4c5e5565c25393f377827aca/kotlin-scripting-compiler-impl-embeddable-1.4.0.jar,trove4j-1.0.20181211.jar,kotlin-scripting-compiler-impl-embeddable-1.4.0.jar")
85+
attribute("Bundle-ClassPath", ".,kotlin-script-util-1.4.0.jar,kotlin-script-runtime-1.4.0.jar,kotlin-scripting-compiler-embeddable-1.4.0.jar,kotlin-scripting-compiler-impl-embeddable-1.4.0.jar,trove4j-1.0.20181211.jar,kotlin-scripting-compiler-impl-embeddable-1.4.0.jar")
8586

8687
exportPackage("kotlin.script.*")
87-
privatePackage("org.jetbrains.kotlin.*")
88+
privatePackage("org.jetbrains.kotlin.*", "org.jetbrains.jps.*", "gnu.trove.*")
8889
excludePackage("org.sonatype.aether.*", "com.jcabi.aether", "sun.misc", "sun.nio.ch", "com.sun.*", "gnu.trove",
8990
"org.jetbrains.kotlin.com.*", "org.jetbrains.kotlin.org.*", "org.jetbrains.org.*",
9091
"org.jetbrains.ide", "org.jetbrains.annotations", "org.checkerframework.*",
9192
// TODO ?
9293
"javaslang.*",
9394
"net.rubygrapefruit.platform",
94-
"kotlinx.coroutines",
95-
"org.jetbrains.jps.*"
95+
"kotlinx.coroutines"
9696
)
9797
}
9898
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.cognifide.slinkt
2+
3+
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
4+
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
5+
import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
6+
import org.jetbrains.kotlin.cli.common.repl.*
7+
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
8+
import org.jetbrains.kotlin.cli.jvm.config.addJvmSdkRoots
9+
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
10+
import org.jetbrains.kotlin.config.*
11+
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
12+
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.GenericReplCompiler
13+
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
14+
import org.jetbrains.kotlin.scripting.resolve.KotlinScriptDefinitionFromAnnotatedTemplate
15+
import org.jetbrains.kotlin.utils.PathUtil
16+
import java.io.File
17+
import java.net.URLClassLoader
18+
import java.util.concurrent.locks.ReentrantReadWriteLock
19+
import javax.script.ScriptContext
20+
import javax.script.ScriptEngineFactory
21+
import kotlin.reflect.KClass
22+
23+
class KotlinEngine(
24+
val classLoader: ClassLoader,
25+
factory: ScriptEngineFactory,
26+
val templateClasspath: List<File>,
27+
templateClassName: String,
28+
val getScriptArgs: (ScriptContext, Array<out KClass<out Any>>?) -> ScriptArgsWithTypes?,
29+
val scriptArgsTypes: Array<out KClass<out Any>>?
30+
) : KotlinJsr223JvmScriptEngineBase(factory), KotlinJsr223JvmInvocableScriptEngine {
31+
32+
override val replCompiler: ReplCompiler by lazy {
33+
GenericReplCompiler(
34+
makeScriptDefinition(templateClasspath, templateClassName),
35+
makeCompilerConfiguration(),
36+
PrintingMessageCollector(System.out, MessageRenderer.WITHOUT_PATHS, false))
37+
}
38+
// TODO: bindings passing works only once on the first eval, subsequent setContext/setBindings call have no effect. Consider making it dynamic, but take history into account
39+
private val localEvaluator by lazy { GenericReplCompilingEvaluator(replCompiler, templateClasspath, classLoader, getScriptArgs(getContext(), scriptArgsTypes)) }
40+
41+
override val replEvaluator: ReplFullEvaluator get() = localEvaluator
42+
43+
override val state: IReplStageState<*> get() = getCurrentState(getContext())
44+
45+
override fun createState(lock: ReentrantReadWriteLock): IReplStageState<*> = replEvaluator.createState(lock)
46+
47+
override fun overrideScriptArgs(context: ScriptContext): ScriptArgsWithTypes? = getScriptArgs(context, scriptArgsTypes)
48+
49+
private fun makeScriptDefinition(templateClasspath: List<File>, templateClassName: String): KotlinScriptDefinition {
50+
val classloader = URLClassLoader(templateClasspath.map { it.toURI().toURL() }.toTypedArray(), this.javaClass.classLoader)
51+
val cls = classloader.loadClass(templateClassName)
52+
return KotlinScriptDefinitionFromAnnotatedTemplate(cls.kotlin, emptyMap())
53+
}
54+
55+
private fun makeCompilerConfiguration() = CompilerConfiguration().apply {
56+
addJvmSdkRoots(PathUtil.getJdkClassesRootsFromCurrentJre())
57+
addJvmClasspathRoots(templateClasspath)
58+
put(CLIConfigurationKeys.INTELLIJ_PLUGIN_ROOT, System.getProperty("user.dir")) //TODO tmp
59+
add(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, ScriptingCompilerConfigurationComponentRegistrar())
60+
put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script")
61+
languageVersionSettings = LanguageVersionSettingsImpl(
62+
LanguageVersion.LATEST_STABLE, ApiVersion.LATEST_STABLE, mapOf(AnalysisFlags.skipMetadataVersionCheck to true)
63+
)
64+
}
65+
}

src/main/kotlin/com/cognifide/slinkt/KotlinFactory.kt

+9-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.cognifide.slinkt
22

33
import org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineFactoryBase
44
import org.jetbrains.kotlin.cli.common.repl.ScriptArgsWithTypes
5-
import org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngine
65
import org.jetbrains.kotlin.script.jsr223.KotlinStandardJsr223ScriptTemplate
76
import java.io.File
87
import javax.script.Bindings
@@ -11,12 +10,18 @@ import javax.script.ScriptEngine
1110

1211
class KotlinFactory(val classLoader: ClassLoader) : KotlinJsr223JvmScriptEngineFactoryBase() {
1312

14-
override fun getScriptEngine(): ScriptEngine =
15-
KotlinJsr223JvmLocalScriptEngine(
13+
override fun getScriptEngine(): ScriptEngine {
14+
System.setProperty("project.structure.add.tools.jar.to.new.jdk", "false")
15+
16+
return KotlinEngine(
17+
classLoader,
1618
this,
1719
listOf(File("/Users/krystian.panek/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-util/1.4.0/7a46a84420efbeff02a9e2cb7306bbe288bf01cc/kotlin-script-util-1.4.0.jar")),
1820
KotlinStandardJsr223ScriptTemplate::class.qualifiedName!!,
19-
{ ctx, types -> ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray()) },
21+
{ ctx, types ->
22+
ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray())
23+
},
2024
arrayOf(Bindings::class)
2125
)
26+
}
2227
}

0 commit comments

Comments
 (0)