Remove ScriptCompileConfiguration as separate entity, refactor pieces accordingly
This commit is contained in:
+5
-3
@@ -10,12 +10,14 @@ import java.io.File
|
|||||||
import kotlin.script.experimental.api.EvaluationResult
|
import kotlin.script.experimental.api.EvaluationResult
|
||||||
import kotlin.script.experimental.api.ResultWithDiagnostics
|
import kotlin.script.experimental.api.ResultWithDiagnostics
|
||||||
import kotlin.script.experimental.host.toScriptSource
|
import kotlin.script.experimental.host.toScriptSource
|
||||||
import kotlin.script.experimental.jvmhost.makeBasicHostFromAnnotatedScriptBaseClass
|
import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost
|
||||||
|
import kotlin.script.experimental.jvmhost.createBasicScriptDefinitionFromAnnotatedBaseClass
|
||||||
|
|
||||||
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
|
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
|
||||||
val host = makeBasicHostFromAnnotatedScriptBaseClass<MyScriptWithMavenDeps>()
|
|
||||||
|
|
||||||
return host.eval(scriptFile.toScriptSource(), null, null)
|
val scriptDefinition = createBasicScriptDefinitionFromAnnotatedBaseClass<MyScriptWithMavenDeps>()
|
||||||
|
|
||||||
|
return BasicJvmScriptingHost().eval(scriptFile.toScriptSource(), scriptDefinition, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun main(vararg args: String) {
|
fun main(vararg args: String) {
|
||||||
|
|||||||
+6
-6
@@ -49,9 +49,9 @@ object MyScriptDefinition : ScriptDefinition(
|
|||||||
|
|
||||||
private val resolver = FilesAndMavenResolver()
|
private val resolver = FilesAndMavenResolver()
|
||||||
|
|
||||||
fun myConfigureOnAnnotations(script: ScriptDataFacade): ResultWithDiagnostics<ScriptCompileConfiguration?> {
|
fun myConfigureOnAnnotations(script: ScriptDataFacade): ResultWithDiagnostics<ScriptDefinition?> {
|
||||||
val annotations = script.collectedData?.get(ScriptCollectedData.foundAnnotations)?.takeIf { it.isNotEmpty() }
|
val annotations = script.collectedData?.get(ScriptCollectedData.foundAnnotations)?.takeIf { it.isNotEmpty() }
|
||||||
?: return script.configuration.asSuccess()
|
?: return null.asSuccess()
|
||||||
val scriptContents = object : ScriptContents {
|
val scriptContents = object : ScriptContents {
|
||||||
override val annotations: Iterable<Annotation> = annotations
|
override val annotations: Iterable<Annotation> = annotations
|
||||||
override val file: File? = null
|
override val file: File? = null
|
||||||
@@ -63,11 +63,11 @@ fun myConfigureOnAnnotations(script: ScriptDataFacade): ResultWithDiagnostics<Sc
|
|||||||
}
|
}
|
||||||
return try {
|
return try {
|
||||||
val newDepsFromResolver = resolver.resolve(scriptContents, emptyMap(), ::report, null).get()
|
val newDepsFromResolver = resolver.resolve(scriptContents, emptyMap(), ::report, null).get()
|
||||||
?: return script.configuration.asSuccess(diagnostics)
|
?: return null.asSuccess(diagnostics)
|
||||||
val resolvedClasspath = newDepsFromResolver.classpath.toList().takeIf { it.isNotEmpty() }
|
val resolvedClasspath = newDepsFromResolver.classpath.toList().takeIf { it.isNotEmpty() }
|
||||||
?: return script.configuration.asSuccess(diagnostics)
|
?: return null.asSuccess(diagnostics)
|
||||||
ScriptCompileConfiguration {
|
ScriptDefinition(script.definition) {
|
||||||
dependencies(JvmDependency(resolvedClasspath))
|
dependencies.append(JvmDependency(resolvedClasspath))
|
||||||
}.asSuccess(diagnostics)
|
}.asSuccess(diagnostics)
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
ResultWithDiagnostics.Failure(*diagnostics.toTypedArray(), e.asDiagnostics())
|
ResultWithDiagnostics.Failure(*diagnostics.toTypedArray(), e.asDiagnostics())
|
||||||
|
|||||||
+4
-7
@@ -9,15 +9,14 @@ import org.jetbrains.kotlin.script.examples.jvm.simple.MyScript
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.script.experimental.api.EvaluationResult
|
import kotlin.script.experimental.api.EvaluationResult
|
||||||
import kotlin.script.experimental.api.ResultWithDiagnostics
|
import kotlin.script.experimental.api.ResultWithDiagnostics
|
||||||
import kotlin.script.experimental.api.ScriptCompileConfiguration
|
|
||||||
import kotlin.script.experimental.api.ScriptEvaluationEnvironment
|
|
||||||
import kotlin.script.experimental.host.toScriptSource
|
import kotlin.script.experimental.host.toScriptSource
|
||||||
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
|
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
|
||||||
import kotlin.script.experimental.jvm.jvm
|
import kotlin.script.experimental.jvm.jvm
|
||||||
import kotlin.script.experimental.jvmhost.makeBasicHostFromAnnotatedScriptBaseClass
|
import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost
|
||||||
|
import kotlin.script.experimental.jvmhost.createBasicScriptDefinitionFromAnnotatedBaseClass
|
||||||
|
|
||||||
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
|
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
|
||||||
val additionalCompilationProperties = ScriptCompileConfiguration {
|
val scriptDefinition = createBasicScriptDefinitionFromAnnotatedBaseClass<MyScript> {
|
||||||
jvm {
|
jvm {
|
||||||
dependenciesFromCurrentContext(
|
dependenciesFromCurrentContext(
|
||||||
"scripting-jvm-simple-script" /* script library jar name */
|
"scripting-jvm-simple-script" /* script library jar name */
|
||||||
@@ -25,9 +24,7 @@ fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val host = makeBasicHostFromAnnotatedScriptBaseClass<MyScript>()
|
return BasicJvmScriptingHost().eval(scriptFile.toScriptSource(), scriptDefinition, null)
|
||||||
|
|
||||||
return host.eval(scriptFile.toScriptSource(), additionalCompilationProperties, null)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun main(vararg args: String) {
|
fun main(vararg args: String) {
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ interface ScriptCompiler {
|
|||||||
|
|
||||||
suspend operator fun invoke(
|
suspend operator fun invoke(
|
||||||
script: ScriptSource,
|
script: ScriptSource,
|
||||||
scriptDefinition: ScriptDefinition,
|
scriptDefinition: ScriptDefinition
|
||||||
additionalConfiguration: ScriptCompileConfiguration? = null // overrides properties from definition and configurator.defaultConfiguration
|
|
||||||
): ResultWithDiagnostics<CompiledScript<*>>
|
): ResultWithDiagnostics<CompiledScript<*>>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -18,7 +17,6 @@ interface ScriptCompiler {
|
|||||||
interface CompiledScript<out ScriptBase : Any> {
|
interface CompiledScript<out ScriptBase : Any> {
|
||||||
|
|
||||||
val definition: ScriptDefinition
|
val definition: ScriptDefinition
|
||||||
val additionalConfiguration: ScriptCompileConfiguration?
|
|
||||||
|
|
||||||
suspend fun instantiate(scriptEvaluationEnvironment: ScriptEvaluationEnvironment?): ResultWithDiagnostics<ScriptBase>
|
suspend fun instantiate(scriptEvaluationEnvironment: ScriptEvaluationEnvironment?): ResultWithDiagnostics<ScriptBase>
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-33
@@ -9,37 +9,6 @@ package kotlin.script.experimental.api
|
|||||||
|
|
||||||
import kotlin.script.experimental.util.PropertiesCollection
|
import kotlin.script.experimental.util.PropertiesCollection
|
||||||
|
|
||||||
interface ScriptCompileConfigurationKeys
|
|
||||||
|
|
||||||
class ScriptCompileConfiguration(baseConfigurations: Iterable<ScriptCompileConfiguration>, body: Builder.() -> Unit) :
|
|
||||||
PropertiesCollection(Builder(baseConfigurations).apply(body).data) {
|
|
||||||
|
|
||||||
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
|
|
||||||
constructor(
|
|
||||||
vararg baseConfigurations: ScriptCompileConfiguration, body: Builder.() -> Unit = {}
|
|
||||||
) : this(baseConfigurations.asIterable(), body)
|
|
||||||
|
|
||||||
class Builder internal constructor(baseConfigurations: Iterable<ScriptCompileConfiguration>) :
|
|
||||||
ScriptCompileConfigurationKeys,
|
|
||||||
PropertiesCollection.Builder(baseConfigurations)
|
|
||||||
|
|
||||||
companion object : ScriptCompileConfigurationKeys
|
|
||||||
}
|
|
||||||
|
|
||||||
val ScriptCompileConfigurationKeys.sourceFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
|
|
||||||
|
|
||||||
val ScriptCompileConfigurationKeys.scriptBodyTarget by PropertiesCollection.keyCopy(ScriptDefinition.scriptBodyTarget)
|
|
||||||
|
|
||||||
val ScriptCompileConfigurationKeys.scriptImplicitReceivers by PropertiesCollection.keyCopy(ScriptDefinition.implicitReceivers)
|
|
||||||
|
|
||||||
val ScriptCompileConfigurationKeys.providedProperties by PropertiesCollection.keyCopy(ScriptDefinition.providedProperties)
|
|
||||||
|
|
||||||
val ScriptCompileConfigurationKeys.defaultImports by PropertiesCollection.keyCopy(ScriptDefinition.defaultImports)
|
|
||||||
|
|
||||||
val ScriptCompileConfigurationKeys.dependencies by PropertiesCollection.keyCopy(ScriptDefinition.dependencies)
|
|
||||||
|
|
||||||
val ScriptCompileConfigurationKeys.compilerOptions by PropertiesCollection.keyCopy(ScriptDefinition.compilerOptions)
|
|
||||||
|
|
||||||
|
|
||||||
interface ScriptCollectedDataKeys
|
interface ScriptCollectedDataKeys
|
||||||
|
|
||||||
@@ -55,11 +24,15 @@ val ScriptCollectedDataKeys.foundFragments by PropertiesCollection.key<List<Scri
|
|||||||
class ScriptDataFacade(
|
class ScriptDataFacade(
|
||||||
val source: ScriptSource,
|
val source: ScriptSource,
|
||||||
val definition: ScriptDefinition,
|
val definition: ScriptDefinition,
|
||||||
val configuration: ScriptCompileConfiguration?,
|
|
||||||
val collectedData: ScriptCollectedData? = null
|
val collectedData: ScriptCollectedData? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
typealias RefineScriptCompilationConfigurationHandler = (ScriptDataFacade) -> ResultWithDiagnostics<ScriptCompileConfiguration?>
|
typealias RefineScriptCompilationConfigurationHandler = (ScriptDataFacade) -> ResultWithDiagnostics<ScriptDefinition?>
|
||||||
|
|
||||||
|
// to make it "hasheable" for cashing
|
||||||
|
class RefineConfigurationBeforeParsingData(
|
||||||
|
val handler: RefineScriptCompilationConfigurationHandler
|
||||||
|
)
|
||||||
|
|
||||||
class RefineConfigurationOnAnnotationsData(
|
class RefineConfigurationOnAnnotationsData(
|
||||||
val annotations: List<KotlinType>,
|
val annotations: List<KotlinType>,
|
||||||
|
|||||||
@@ -45,18 +45,18 @@ val ScriptDefinitionKeys.defaultImports by PropertiesCollection.key<List<String>
|
|||||||
|
|
||||||
val ScriptDefinitionKeys.dependencies by PropertiesCollection.key<List<ScriptDependency>>()
|
val ScriptDefinitionKeys.dependencies by PropertiesCollection.key<List<ScriptDependency>>()
|
||||||
|
|
||||||
val ScriptDefinitionKeys.generatedClassAnnotations by PropertiesCollection.key<List<Annotation>>()
|
|
||||||
|
|
||||||
val ScriptDefinitionKeys.copyAnnotationsFrom by PropertiesCollection.key<List<KotlinType>>()
|
val ScriptDefinitionKeys.copyAnnotationsFrom by PropertiesCollection.key<List<KotlinType>>()
|
||||||
|
|
||||||
val ScriptDefinitionKeys.compilerOptions by PropertiesCollection.key<List<String>>() // Q: CommonCompilerOptions instead?
|
val ScriptDefinitionKeys.compilerOptions by PropertiesCollection.key<List<String>>() // Q: CommonCompilerOptions instead?
|
||||||
|
|
||||||
val ScriptDefinitionKeys.refineConfigurationBeforeParsing by PropertiesCollection.key<RefineScriptCompilationConfigurationHandler>() // default: false
|
val ScriptDefinitionKeys.refineConfigurationBeforeParsing by PropertiesCollection.key<RefineConfigurationBeforeParsingData>()
|
||||||
|
|
||||||
val ScriptDefinitionKeys.refineConfigurationOnAnnotations by PropertiesCollection.key<RefineConfigurationOnAnnotationsData>()
|
val ScriptDefinitionKeys.refineConfigurationOnAnnotations by PropertiesCollection.key<RefineConfigurationOnAnnotationsData>()
|
||||||
|
|
||||||
val ScriptDefinitionKeys.refineConfigurationOnSections by PropertiesCollection.key<RefineConfigurationOnSectionsData>()
|
val ScriptDefinitionKeys.refineConfigurationOnSections by PropertiesCollection.key<RefineConfigurationOnSectionsData>()
|
||||||
|
|
||||||
|
val ScriptDefinitionKeys.sourceFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
|
||||||
|
|
||||||
// DSL:
|
// DSL:
|
||||||
|
|
||||||
val ScriptDefinition.Builder.refineConfiguration get() = RefineConfigurationBuilder()
|
val ScriptDefinition.Builder.refineConfiguration get() = RefineConfigurationBuilder()
|
||||||
@@ -65,7 +65,7 @@ val ScriptDefinition.Builder.refineConfiguration get() = RefineConfigurationBuil
|
|||||||
class RefineConfigurationBuilder : PropertiesCollection.Builder() {
|
class RefineConfigurationBuilder : PropertiesCollection.Builder() {
|
||||||
|
|
||||||
fun beforeParsing(handler: RefineScriptCompilationConfigurationHandler) {
|
fun beforeParsing(handler: RefineScriptCompilationConfigurationHandler) {
|
||||||
set(ScriptDefinition.refineConfigurationBeforeParsing, handler)
|
set(ScriptDefinition.refineConfigurationBeforeParsing, RefineConfigurationBeforeParsingData(handler))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onAnnotations(annotations: List<KotlinType>, handler: RefineScriptCompilationConfigurationHandler) {
|
fun onAnnotations(annotations: List<KotlinType>, handler: RefineScriptCompilationConfigurationHandler) {
|
||||||
|
|||||||
+3
-1
@@ -19,7 +19,8 @@ private const val ILLEGAL_CONFIG_ANN_ARG =
|
|||||||
fun createScriptDefinitionFromAnnotatedBaseClass(
|
fun createScriptDefinitionFromAnnotatedBaseClass(
|
||||||
baseClassType: KotlinType,
|
baseClassType: KotlinType,
|
||||||
environment: ScriptingEnvironment,
|
environment: ScriptingEnvironment,
|
||||||
contextClass: KClass<*> = ScriptDefinition::class
|
contextClass: KClass<*> = ScriptDefinition::class,
|
||||||
|
body: ScriptDefinition.Builder.() -> Unit = {}
|
||||||
): ScriptDefinition {
|
): ScriptDefinition {
|
||||||
|
|
||||||
val getScriptingClass = environment[ScriptingEnvironment.getScriptingClass]
|
val getScriptingClass = environment[ScriptingEnvironment.getScriptingClass]
|
||||||
@@ -51,6 +52,7 @@ fun createScriptDefinitionFromAnnotatedBaseClass(
|
|||||||
baseClass.java.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann ->
|
baseClass.java.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann ->
|
||||||
include(scriptingPropsInstance(ann.definition))
|
include(scriptingPropsInstance(ann.definition))
|
||||||
}
|
}
|
||||||
|
body()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -23,7 +23,6 @@ import kotlinx.coroutines.experimental.runBlocking
|
|||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
|
|
||||||
abstract class BasicScriptingHost(
|
abstract class BasicScriptingHost(
|
||||||
val scriptDefinition: ScriptDefinition,
|
|
||||||
val compiler: ScriptCompiler,
|
val compiler: ScriptCompiler,
|
||||||
val evaluator: ScriptEvaluator
|
val evaluator: ScriptEvaluator
|
||||||
) {
|
) {
|
||||||
@@ -31,11 +30,11 @@ abstract class BasicScriptingHost(
|
|||||||
|
|
||||||
open fun eval(
|
open fun eval(
|
||||||
script: ScriptSource,
|
script: ScriptSource,
|
||||||
compileConfiguration: ScriptCompileConfiguration?,
|
scriptDefinition: ScriptDefinition,
|
||||||
environment: ScriptEvaluationEnvironment?
|
environment: ScriptEvaluationEnvironment?
|
||||||
): ResultWithDiagnostics<EvaluationResult> =
|
): ResultWithDiagnostics<EvaluationResult> =
|
||||||
runInCoroutineContext {
|
runInCoroutineContext {
|
||||||
compiler(script, scriptDefinition, compileConfiguration).onSuccess {
|
compiler(script, scriptDefinition).onSuccess {
|
||||||
evaluator(it, environment)
|
evaluator(it, environment)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,10 +7,7 @@ package kotlin.script.experimental.host
|
|||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import kotlin.script.experimental.api.ScriptCompileConfiguration
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.api.ScriptSource
|
|
||||||
import kotlin.script.experimental.api.ScriptSourceNamedFragment
|
|
||||||
import kotlin.script.experimental.api.sourceFragments
|
|
||||||
|
|
||||||
fun ScriptSource.getScriptText(): String = when {
|
fun ScriptSource.getScriptText(): String = when {
|
||||||
text != null -> text!!
|
text != null -> text!!
|
||||||
@@ -19,9 +16,9 @@ fun ScriptSource.getScriptText(): String = when {
|
|||||||
else -> throw RuntimeException("unable to get text from null script")
|
else -> throw RuntimeException("unable to get text from null script")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getMergedScriptText(script: ScriptSource, configuration: ScriptCompileConfiguration?): String {
|
fun getMergedScriptText(script: ScriptSource, configuration: ScriptDefinition?): String {
|
||||||
val originalScriptText = script.getScriptText()
|
val originalScriptText = script.getScriptText()
|
||||||
val sourceFragments = configuration?.get(ScriptCompileConfiguration.sourceFragments)
|
val sourceFragments = configuration?.get(ScriptDefinition.sourceFragments)
|
||||||
return if (sourceFragments == null || sourceFragments.isEmpty()) {
|
return if (sourceFragments == null || sourceFragments.isEmpty()) {
|
||||||
originalScriptText
|
originalScriptText
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -12,8 +12,7 @@ interface ReplSnippetChecker {
|
|||||||
suspend operator fun invoke(
|
suspend operator fun invoke(
|
||||||
snippet: ReplSnippetSource,
|
snippet: ReplSnippetSource,
|
||||||
state: ReplStageState<*>,
|
state: ReplStageState<*>,
|
||||||
scriptDefinition: ScriptDefinition,
|
scriptDefinition: ScriptDefinition
|
||||||
additionalConfiguration: ScriptCompileConfiguration? = null // overrides properties from definition
|
|
||||||
): ResultWithDiagnostics<Unit>
|
): ResultWithDiagnostics<Unit>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,8 +21,7 @@ interface ReplSnippetCompiler {
|
|||||||
suspend operator fun invoke(
|
suspend operator fun invoke(
|
||||||
snippet: ReplSnippetSource,
|
snippet: ReplSnippetSource,
|
||||||
state: ReplStageState<*>,
|
state: ReplStageState<*>,
|
||||||
scriptDefinition: ScriptDefinition,
|
scriptDefinition: ScriptDefinition
|
||||||
additionalConfiguration: ScriptCompileConfiguration? = null // overrides properties from definition
|
|
||||||
): ResultWithDiagnostics<CompiledReplSnippet<*>>
|
): ResultWithDiagnostics<CompiledReplSnippet<*>>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import kotlinx.coroutines.experimental.CoroutineScope
|
|||||||
import kotlinx.coroutines.experimental.runBlocking
|
import kotlinx.coroutines.experimental.runBlocking
|
||||||
import kotlin.script.experimental.api.EvaluationResult
|
import kotlin.script.experimental.api.EvaluationResult
|
||||||
import kotlin.script.experimental.api.ResultWithDiagnostics
|
import kotlin.script.experimental.api.ResultWithDiagnostics
|
||||||
import kotlin.script.experimental.api.ScriptCompileConfiguration
|
|
||||||
import kotlin.script.experimental.api.ScriptDefinition
|
import kotlin.script.experimental.api.ScriptDefinition
|
||||||
import kotlin.script.experimental.util.PropertiesCollection
|
import kotlin.script.experimental.util.PropertiesCollection
|
||||||
|
|
||||||
@@ -53,7 +52,6 @@ abstract class ReplHost(
|
|||||||
snippet: ReplSnippetSource,
|
snippet: ReplSnippetSource,
|
||||||
state: ReplStageState<*>,
|
state: ReplStageState<*>,
|
||||||
scriptDefinition: ScriptDefinition,
|
scriptDefinition: ScriptDefinition,
|
||||||
additionalConfiguration: ScriptCompileConfiguration? = null, // overrides properties from definition
|
|
||||||
replEvaluationEnvironment: ReplEvaluationEnvironment
|
replEvaluationEnvironment: ReplEvaluationEnvironment
|
||||||
): ResultWithDiagnostics<EvaluationResult>
|
): ResultWithDiagnostics<EvaluationResult>
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-9
@@ -14,17 +14,13 @@ import kotlin.script.experimental.host.BasicScriptingHost
|
|||||||
import kotlin.script.experimental.jvm.defaultJvmScriptingEnvironment
|
import kotlin.script.experimental.jvm.defaultJvmScriptingEnvironment
|
||||||
|
|
||||||
open class BasicJvmScriptingHost(
|
open class BasicJvmScriptingHost(
|
||||||
scriptDefinition: ScriptDefinition,
|
|
||||||
hostEnvironment: ScriptingEnvironment = defaultJvmScriptingEnvironment,
|
hostEnvironment: ScriptingEnvironment = defaultJvmScriptingEnvironment,
|
||||||
compiler: JvmScriptCompiler = JvmScriptCompiler(hostEnvironment),
|
compiler: JvmScriptCompiler = JvmScriptCompiler(hostEnvironment),
|
||||||
evaluator: ScriptEvaluator = BasicJvmScriptEvaluator()
|
evaluator: ScriptEvaluator = BasicJvmScriptEvaluator()
|
||||||
) : BasicScriptingHost(scriptDefinition, compiler, evaluator)
|
) : BasicScriptingHost(compiler, evaluator)
|
||||||
|
|
||||||
|
|
||||||
inline fun <reified T : Any> makeBasicHostFromAnnotatedScriptBaseClass(
|
inline fun <reified T : Any> createBasicScriptDefinitionFromAnnotatedBaseClass(
|
||||||
hostEnvironment: ScriptingEnvironment = defaultJvmScriptingEnvironment
|
hostEnvironment: ScriptingEnvironment = defaultJvmScriptingEnvironment,
|
||||||
) =
|
noinline body: ScriptDefinition.Builder.() -> Unit = {}
|
||||||
BasicJvmScriptingHost(
|
): ScriptDefinition = createScriptDefinitionFromAnnotatedBaseClass(KotlinType(T::class), hostEnvironment, ScriptDefinition::class, body)
|
||||||
createScriptDefinitionFromAnnotatedBaseClass(KotlinType(T::class), hostEnvironment),
|
|
||||||
hostEnvironment
|
|
||||||
)
|
|
||||||
|
|||||||
+12
-18
@@ -47,12 +47,10 @@ import kotlin.script.experimental.jvmhost.JvmScriptEvaluationEnvironment
|
|||||||
import kotlin.script.experimental.jvmhost.KJvmCompilerProxy
|
import kotlin.script.experimental.jvmhost.KJvmCompilerProxy
|
||||||
import kotlin.script.experimental.jvmhost.baseClassLoader
|
import kotlin.script.experimental.jvmhost.baseClassLoader
|
||||||
import kotlin.script.experimental.util.getFirstFromChainOrNull
|
import kotlin.script.experimental.util.getFirstFromChainOrNull
|
||||||
import kotlin.script.experimental.util.getMergedFromChainOrNull
|
|
||||||
import kotlin.script.experimental.util.getOrError
|
import kotlin.script.experimental.util.getOrError
|
||||||
|
|
||||||
class KJvmCompiledScript<out ScriptBase : Any>(
|
class KJvmCompiledScript<out ScriptBase : Any>(
|
||||||
override val definition: ScriptDefinition,
|
override val definition: ScriptDefinition,
|
||||||
override val additionalConfiguration: ScriptCompileConfiguration?,
|
|
||||||
private val generationState: GenerationState,
|
private val generationState: GenerationState,
|
||||||
private val scriptClassFQName: String
|
private val scriptClassFQName: String
|
||||||
) : CompiledScript<ScriptBase> {
|
) : CompiledScript<ScriptBase> {
|
||||||
@@ -60,7 +58,7 @@ class KJvmCompiledScript<out ScriptBase : Any>(
|
|||||||
override suspend fun instantiate(scriptEvaluationEnvironment: ScriptEvaluationEnvironment?): ResultWithDiagnostics<ScriptBase> = try {
|
override suspend fun instantiate(scriptEvaluationEnvironment: ScriptEvaluationEnvironment?): ResultWithDiagnostics<ScriptBase> = try {
|
||||||
val baseClassLoader = scriptEvaluationEnvironment?.get(JvmScriptEvaluationEnvironment.baseClassLoader)
|
val baseClassLoader = scriptEvaluationEnvironment?.get(JvmScriptEvaluationEnvironment.baseClassLoader)
|
||||||
?: Thread.currentThread().contextClassLoader
|
?: Thread.currentThread().contextClassLoader
|
||||||
val dependencies = additionalConfiguration?.get(ScriptDefinition.dependencies)
|
val dependencies = definition[ScriptDefinition.dependencies]
|
||||||
?.flatMap { (it as? JvmDependency)?.classpath?.map { it.toURI().toURL() } ?: emptyList() }
|
?.flatMap { (it as? JvmDependency)?.classpath?.map { it.toURI().toURL() } ?: emptyList() }
|
||||||
// TODO: previous dependencies and classloaders should be taken into account here
|
// TODO: previous dependencies and classloaders should be taken into account here
|
||||||
val classLoaderWithDeps =
|
val classLoaderWithDeps =
|
||||||
@@ -80,8 +78,7 @@ class KJvmCompilerImpl(val hostEnvironment: ScriptingEnvironment) : KJvmCompiler
|
|||||||
|
|
||||||
override fun compile(
|
override fun compile(
|
||||||
script: ScriptSource,
|
script: ScriptSource,
|
||||||
scriptDefinition: ScriptDefinition,
|
scriptDefinition: ScriptDefinition
|
||||||
additionalConfiguration: ScriptCompileConfiguration?
|
|
||||||
): ResultWithDiagnostics<CompiledScript<*>> {
|
): ResultWithDiagnostics<CompiledScript<*>> {
|
||||||
val messageCollector = ScriptDiagnosticsMessageCollector()
|
val messageCollector = ScriptDiagnosticsMessageCollector()
|
||||||
|
|
||||||
@@ -92,13 +89,12 @@ class KJvmCompilerImpl(val hostEnvironment: ScriptingEnvironment) : KJvmCompiler
|
|||||||
setIdeaIoUseFallback()
|
setIdeaIoUseFallback()
|
||||||
|
|
||||||
var environment: KotlinCoreEnvironment? = null
|
var environment: KotlinCoreEnvironment? = null
|
||||||
var updatedScriptCompileConfiguration = additionalConfiguration
|
var updatedDefinition = scriptDefinition
|
||||||
|
|
||||||
fun updateClasspath(classpath: List<File>) {
|
fun updateClasspath(classpath: List<File>) {
|
||||||
environment!!.updateClasspath(classpath.map(::JvmClasspathRoot))
|
environment!!.updateClasspath(classpath.map(::JvmClasspathRoot))
|
||||||
if (classpath.isNotEmpty()) {
|
if (classpath.isNotEmpty()) {
|
||||||
updatedScriptCompileConfiguration = ScriptCompileConfiguration {
|
updatedDefinition = ScriptDefinition(updatedDefinition) {
|
||||||
include(updatedScriptCompileConfiguration)
|
|
||||||
dependencies.append(JvmDependency(classpath))
|
dependencies.append(JvmDependency(classpath))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,20 +104,20 @@ class KJvmCompilerImpl(val hostEnvironment: ScriptingEnvironment) : KJvmCompiler
|
|||||||
val kotlinCompilerConfiguration = org.jetbrains.kotlin.config.CompilerConfiguration().apply {
|
val kotlinCompilerConfiguration = org.jetbrains.kotlin.config.CompilerConfiguration().apply {
|
||||||
add(
|
add(
|
||||||
JVMConfigurationKeys.SCRIPT_DEFINITIONS,
|
JVMConfigurationKeys.SCRIPT_DEFINITIONS,
|
||||||
BridgeScriptDefinition(scriptDefinition, additionalConfiguration, hostEnvironment, ::updateClasspath)
|
BridgeScriptDefinition(scriptDefinition, hostEnvironment, ::updateClasspath)
|
||||||
)
|
)
|
||||||
put<MessageCollector>(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
|
put<MessageCollector>(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
|
||||||
put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true)
|
put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true)
|
||||||
|
|
||||||
var isModularJava = false
|
var isModularJava = false
|
||||||
getFirstFromChainOrNull(ScriptCompileConfiguration.jvm.javaHome, updatedScriptCompileConfiguration, hostEnvironment)?.let {
|
getFirstFromChainOrNull(ScriptDefinition.jvm.javaHome, updatedDefinition, hostEnvironment)?.let {
|
||||||
put(JVMConfigurationKeys.JDK_HOME, it)
|
put(JVMConfigurationKeys.JDK_HOME, it)
|
||||||
isModularJava = CoreJrtFileSystem.isModularJdk(it)
|
isModularJava = CoreJrtFileSystem.isModularJdk(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
getMergedFromChainOrNull(ScriptDefinition.dependencies, scriptDefinition, updatedScriptCompileConfiguration)?.let {
|
updatedDefinition[ScriptDefinition.dependencies]?.let { dependencies ->
|
||||||
addJvmClasspathRoots(
|
addJvmClasspathRoots(
|
||||||
it.flatMap {
|
dependencies.flatMap {
|
||||||
(it as JvmDependency).classpath
|
(it as JvmDependency).classpath
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -151,7 +147,7 @@ class KJvmCompilerImpl(val hostEnvironment: ScriptingEnvironment) : KJvmCompiler
|
|||||||
val analyzerWithCompilerReport = AnalyzerWithCompilerReport(messageCollector, environment.configuration.languageVersionSettings)
|
val analyzerWithCompilerReport = AnalyzerWithCompilerReport(messageCollector, environment.configuration.languageVersionSettings)
|
||||||
|
|
||||||
val psiFileFactory: PsiFileFactoryImpl = PsiFileFactory.getInstance(environment.project) as PsiFileFactoryImpl
|
val psiFileFactory: PsiFileFactoryImpl = PsiFileFactory.getInstance(environment.project) as PsiFileFactoryImpl
|
||||||
val scriptText = getMergedScriptText(script, updatedScriptCompileConfiguration)
|
val scriptText = getMergedScriptText(script, updatedDefinition)
|
||||||
val scriptFileName = "script" // TODO: extract from file/url if available
|
val scriptFileName = "script" // TODO: extract from file/url if available
|
||||||
val virtualFile = LightVirtualFile(
|
val virtualFile = LightVirtualFile(
|
||||||
"$scriptFileName${KotlinParserDefinition.STD_SCRIPT_EXT}",
|
"$scriptFileName${KotlinParserDefinition.STD_SCRIPT_EXT}",
|
||||||
@@ -196,7 +192,7 @@ class KJvmCompilerImpl(val hostEnvironment: ScriptingEnvironment) : KJvmCompiler
|
|||||||
org.jetbrains.kotlin.codegen.CompilationErrorHandler.THROW_EXCEPTION
|
org.jetbrains.kotlin.codegen.CompilationErrorHandler.THROW_EXCEPTION
|
||||||
)
|
)
|
||||||
|
|
||||||
val res = KJvmCompiledScript<Any>(scriptDefinition, updatedScriptCompileConfiguration, generationState, scriptFileName.capitalize())
|
val res = KJvmCompiledScript<Any>(updatedDefinition, generationState, scriptFileName.capitalize())
|
||||||
|
|
||||||
return ResultWithDiagnostics.Success(res, messageCollector.diagnostics)
|
return ResultWithDiagnostics.Success(res, messageCollector.diagnostics)
|
||||||
} catch (ex: Throwable) {
|
} catch (ex: Throwable) {
|
||||||
@@ -242,7 +238,6 @@ class ScriptDiagnosticsMessageCollector : MessageCollector {
|
|||||||
|
|
||||||
internal class BridgeScriptDefinition(
|
internal class BridgeScriptDefinition(
|
||||||
scriptDefinition: ScriptDefinition,
|
scriptDefinition: ScriptDefinition,
|
||||||
additionalCompilationConfiguration: ScriptCompileConfiguration?,
|
|
||||||
hostEnvironment: ScriptingEnvironment,
|
hostEnvironment: ScriptingEnvironment,
|
||||||
updateClasspath: (List<File>) -> Unit
|
updateClasspath: (List<File>) -> Unit
|
||||||
) : KotlinScriptDefinition(
|
) : KotlinScriptDefinition(
|
||||||
@@ -253,12 +248,11 @@ internal class BridgeScriptDefinition(
|
|||||||
) {
|
) {
|
||||||
override val acceptedAnnotations = run {
|
override val acceptedAnnotations = run {
|
||||||
val cl = this::class.java.classLoader
|
val cl = this::class.java.classLoader
|
||||||
getFirstFromChainOrNull(ScriptDefinition.refineConfigurationOnAnnotations, scriptDefinition, additionalCompilationConfiguration)
|
scriptDefinition[ScriptDefinition.refineConfigurationOnAnnotations]?.annotations
|
||||||
?.annotations
|
|
||||||
?.map { (cl.loadClass(it.typeName) as Class<out Annotation>).kotlin }
|
?.map { (cl.loadClass(it.typeName) as Class<out Annotation>).kotlin }
|
||||||
?: emptyList()
|
?: emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override val dependencyResolver: DependenciesResolver =
|
override val dependencyResolver: DependenciesResolver =
|
||||||
BridgeDependenciesResolver(scriptDefinition, additionalCompilationConfiguration, updateClasspath)
|
BridgeDependenciesResolver(scriptDefinition, updateClasspath)
|
||||||
}
|
}
|
||||||
|
|||||||
-14
@@ -5,23 +5,9 @@
|
|||||||
|
|
||||||
package kotlin.script.experimental.jvmhost.impl
|
package kotlin.script.experimental.jvmhost.impl
|
||||||
|
|
||||||
import kotlin.script.experimental.api.ScriptCompileConfiguration
|
|
||||||
import kotlin.script.experimental.api.ScriptingEnvironment
|
import kotlin.script.experimental.api.ScriptingEnvironment
|
||||||
import kotlin.script.experimental.jvm.defaultJvmScriptingEnvironment
|
import kotlin.script.experimental.jvm.defaultJvmScriptingEnvironment
|
||||||
|
|
||||||
internal fun mergeConfigurations(vararg configurations: ScriptCompileConfiguration?): ScriptCompileConfiguration? {
|
|
||||||
val nonEmptyConfigurations = configurations.filter { it != null && it.properties.isNotEmpty() }
|
|
||||||
return when {
|
|
||||||
nonEmptyConfigurations.isEmpty() -> null
|
|
||||||
nonEmptyConfigurations.size == 1 -> nonEmptyConfigurations.first()!!
|
|
||||||
else -> ScriptCompileConfiguration {
|
|
||||||
for (configuration in nonEmptyConfigurations) {
|
|
||||||
include(configuration!!)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun ScriptingEnvironment.withDefaults(): ScriptingEnvironment =
|
fun ScriptingEnvironment.withDefaults(): ScriptingEnvironment =
|
||||||
if (this == defaultJvmScriptingEnvironment || defaultJvmScriptingEnvironment.properties.all {
|
if (this == defaultJvmScriptingEnvironment || defaultJvmScriptingEnvironment.properties.all {
|
||||||
this.properties.containsKey(it.key)
|
this.properties.containsKey(it.key)
|
||||||
|
|||||||
+11
-15
@@ -10,20 +10,19 @@ package kotlin.script.experimental.jvmhost
|
|||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.jvm.defaultJvmScriptingEnvironment
|
import kotlin.script.experimental.jvm.defaultJvmScriptingEnvironment
|
||||||
import kotlin.script.experimental.jvmhost.impl.KJvmCompilerImpl
|
import kotlin.script.experimental.jvmhost.impl.KJvmCompilerImpl
|
||||||
import kotlin.script.experimental.jvmhost.impl.mergeConfigurations
|
|
||||||
import kotlin.script.experimental.jvmhost.impl.withDefaults
|
import kotlin.script.experimental.jvmhost.impl.withDefaults
|
||||||
|
|
||||||
interface CompiledJvmScriptsCache {
|
interface CompiledJvmScriptsCache {
|
||||||
fun get(script: ScriptSource, scriptDefinition: ScriptDefinition, configuration: ScriptCompileConfiguration?): CompiledScript<*>?
|
fun get(script: ScriptSource, scriptDefinition: ScriptDefinition): CompiledScript<*>?
|
||||||
fun store(compiledScript: CompiledScript<*>, scriptDefinition: ScriptDefinition, configuration: ScriptCompileConfiguration?)
|
fun store(compiledScript: CompiledScript<*>, scriptDefinition: ScriptDefinition)
|
||||||
|
|
||||||
object NoCache : CompiledJvmScriptsCache {
|
object NoCache : CompiledJvmScriptsCache {
|
||||||
override fun get(
|
override fun get(
|
||||||
script: ScriptSource, scriptDefinition: ScriptDefinition, configuration: ScriptCompileConfiguration?
|
script: ScriptSource, scriptDefinition: ScriptDefinition
|
||||||
): CompiledScript<*>? = null
|
): CompiledScript<*>? = null
|
||||||
|
|
||||||
override fun store(
|
override fun store(
|
||||||
compiledScript: CompiledScript<*>, scriptDefinition: ScriptDefinition, configuration: ScriptCompileConfiguration?
|
compiledScript: CompiledScript<*>, scriptDefinition: ScriptDefinition
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,25 +36,23 @@ open class JvmScriptCompiler(
|
|||||||
|
|
||||||
override suspend operator fun invoke(
|
override suspend operator fun invoke(
|
||||||
script: ScriptSource,
|
script: ScriptSource,
|
||||||
scriptDefinition: ScriptDefinition,
|
scriptDefinition: ScriptDefinition
|
||||||
additionalConfiguration: ScriptCompileConfiguration?
|
|
||||||
): ResultWithDiagnostics<CompiledScript<*>> {
|
): ResultWithDiagnostics<CompiledScript<*>> {
|
||||||
val refineConfigurationFn = scriptDefinition[ScriptDefinition.refineConfigurationBeforeParsing]
|
val refineConfigurationFn = scriptDefinition[ScriptDefinition.refineConfigurationBeforeParsing]
|
||||||
val refinedConfiguration =
|
val refinedConfiguration =
|
||||||
refineConfigurationFn?.invoke(ScriptDataFacade(script, scriptDefinition, additionalConfiguration))?.let {
|
refineConfigurationFn?.handler?.invoke(ScriptDataFacade(script, scriptDefinition))?.let {
|
||||||
when (it) {
|
when (it) {
|
||||||
is ResultWithDiagnostics.Failure -> return it
|
is ResultWithDiagnostics.Failure -> return it
|
||||||
is ResultWithDiagnostics.Success -> it.value
|
is ResultWithDiagnostics.Success -> it.value
|
||||||
}
|
}
|
||||||
}
|
} ?: scriptDefinition
|
||||||
val actualConfiguration = mergeConfigurations(additionalConfiguration, refinedConfiguration)
|
val cached = cache.get(script, refinedConfiguration)
|
||||||
val cached = cache.get(script, scriptDefinition, actualConfiguration)
|
|
||||||
|
|
||||||
if (cached != null) return cached.asSuccess()
|
if (cached != null) return cached.asSuccess()
|
||||||
|
|
||||||
return compilerProxy.compile(script, scriptDefinition, actualConfiguration).also {
|
return compilerProxy.compile(script, refinedConfiguration).also {
|
||||||
if (it is ResultWithDiagnostics.Success) {
|
if (it is ResultWithDiagnostics.Success) {
|
||||||
cache.store(it.value, scriptDefinition, actualConfiguration)
|
cache.store(it.value, refinedConfiguration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,8 +61,7 @@ open class JvmScriptCompiler(
|
|||||||
interface KJvmCompilerProxy {
|
interface KJvmCompilerProxy {
|
||||||
fun compile(
|
fun compile(
|
||||||
script: ScriptSource,
|
script: ScriptSource,
|
||||||
scriptDefinition: ScriptDefinition,
|
scriptDefinition: ScriptDefinition
|
||||||
additionalConfiguration: ScriptCompileConfiguration?
|
|
||||||
): ResultWithDiagnostics<CompiledScript<*>>
|
): ResultWithDiagnostics<CompiledScript<*>>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-7
@@ -18,11 +18,9 @@ import kotlin.script.experimental.host.toScriptSource
|
|||||||
import kotlin.script.experimental.jvm.JvmDependency
|
import kotlin.script.experimental.jvm.JvmDependency
|
||||||
import kotlin.script.experimental.jvm.compat.mapToLegacyScriptReportPosition
|
import kotlin.script.experimental.jvm.compat.mapToLegacyScriptReportPosition
|
||||||
import kotlin.script.experimental.jvm.compat.mapToLegacyScriptReportSeverity
|
import kotlin.script.experimental.jvm.compat.mapToLegacyScriptReportSeverity
|
||||||
import kotlin.script.experimental.util.getFirstFromChainOrNull
|
|
||||||
|
|
||||||
class BridgeDependenciesResolver(
|
class BridgeDependenciesResolver(
|
||||||
val scriptDefinition: ScriptDefinition,
|
val scriptDefinition: ScriptDefinition,
|
||||||
private val additionalConfiguration: ScriptCompileConfiguration?,
|
|
||||||
val onClasspathUpdated: (List<File>) -> Unit = {}
|
val onClasspathUpdated: (List<File>) -> Unit = {}
|
||||||
) : AsyncDependenciesResolver {
|
) : AsyncDependenciesResolver {
|
||||||
|
|
||||||
@@ -46,7 +44,7 @@ class BridgeDependenciesResolver(
|
|||||||
if (refineFn == null) null
|
if (refineFn == null) null
|
||||||
else {
|
else {
|
||||||
val res = refineFn(
|
val res = refineFn(
|
||||||
ScriptDataFacade(scriptContents.toScriptSource(), scriptDefinition, additionalConfiguration, processedScriptData)
|
ScriptDataFacade(scriptContents.toScriptSource(), scriptDefinition, processedScriptData)
|
||||||
)
|
)
|
||||||
when (res) {
|
when (res) {
|
||||||
is ResultWithDiagnostics.Failure ->
|
is ResultWithDiagnostics.Failure ->
|
||||||
@@ -62,7 +60,7 @@ class BridgeDependenciesResolver(
|
|||||||
?.flatMap { (it as JvmDependency).classpath } ?: emptyList()
|
?.flatMap { (it as JvmDependency).classpath } ?: emptyList()
|
||||||
if (newClasspath.isNotEmpty()) {
|
if (newClasspath.isNotEmpty()) {
|
||||||
val oldClasspath =
|
val oldClasspath =
|
||||||
getFirstFromChainOrNull(ScriptDefinition.dependencies, additionalConfiguration, scriptDefinition)
|
scriptDefinition[ScriptDefinition.dependencies]
|
||||||
?.flatMap { (it as JvmDependency).classpath } ?: emptyList()
|
?.flatMap { (it as JvmDependency).classpath } ?: emptyList()
|
||||||
if (newClasspath != oldClasspath) {
|
if (newClasspath != oldClasspath) {
|
||||||
onClasspathUpdated(newClasspath)
|
onClasspathUpdated(newClasspath)
|
||||||
@@ -71,9 +69,7 @@ class BridgeDependenciesResolver(
|
|||||||
DependenciesResolver.ResolveResult.Success(
|
DependenciesResolver.ResolveResult.Success(
|
||||||
ScriptDependencies(
|
ScriptDependencies(
|
||||||
classpath = newClasspath, // TODO: maybe it should return only increment from the initial config
|
classpath = newClasspath, // TODO: maybe it should return only increment from the initial config
|
||||||
imports = getFirstFromChainOrNull(
|
imports = scriptDefinition[ScriptDefinition.defaultImports]?.toList() ?: emptyList()
|
||||||
ScriptDefinition.defaultImports, refinedConfiguration, additionalConfiguration, scriptDefinition
|
|
||||||
)?.toList() ?: emptyList()
|
|
||||||
),
|
),
|
||||||
diagnostics
|
diagnostics
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,26 +7,27 @@ package kotlin.script.experimental.jvm
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContext
|
import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.script.experimental.api.ScriptDefinition
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.api.ScriptDefinitionKeys
|
|
||||||
import kotlin.script.experimental.api.ScriptDependency
|
|
||||||
import kotlin.script.experimental.api.dependencies
|
|
||||||
import kotlin.script.experimental.util.PropertiesCollection
|
import kotlin.script.experimental.util.PropertiesCollection
|
||||||
|
|
||||||
open class JvmScriptDefinition : PropertiesCollection.Builder()
|
data class JvmDependency(val classpath: List<File>) : ScriptDependency {
|
||||||
|
@Suppress("unused")
|
||||||
val ScriptDefinitionKeys.jvm get() = JvmScriptDefinition()
|
|
||||||
|
|
||||||
|
|
||||||
class JvmDependency(val classpath: List<File>) : ScriptDependency {
|
|
||||||
constructor(vararg classpathEntries: File) : this(classpathEntries.asList())
|
constructor(vararg classpathEntries: File) : this(classpathEntries.asList())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun JvmScriptDefinition.dependenciesFromCurrentContext(vararg libraries: String, wholeClasspath: Boolean = false) {
|
interface JvmScriptDefinitionKeys
|
||||||
|
|
||||||
|
open class JvmScriptDefinitionBuilder : PropertiesCollection.Builder(), JvmScriptDefinitionKeys {
|
||||||
|
companion object : PropertiesCollection.Builder.BuilderExtension<JvmScriptDefinitionBuilder>, JvmScriptDefinitionKeys {
|
||||||
|
override fun get() = JvmScriptDefinitionBuilder()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun JvmScriptDefinitionBuilder.dependenciesFromCurrentContext(vararg libraries: String, wholeClasspath: Boolean = false) {
|
||||||
dependenciesFromClassloader(*libraries, wholeClasspath = wholeClasspath)
|
dependenciesFromClassloader(*libraries, wholeClasspath = wholeClasspath)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun JvmScriptDefinition.dependenciesFromClassloader(
|
fun JvmScriptDefinitionBuilder.dependenciesFromClassloader(
|
||||||
vararg libraries: String,
|
vararg libraries: String,
|
||||||
classLoader: ClassLoader = Thread.currentThread().contextClassLoader,
|
classLoader: ClassLoader = Thread.currentThread().contextClassLoader,
|
||||||
wholeClasspath: Boolean = false
|
wholeClasspath: Boolean = false
|
||||||
@@ -35,3 +36,10 @@ fun JvmScriptDefinition.dependenciesFromClassloader(
|
|||||||
JvmDependency(scriptCompilationClasspathFromContext(*libraries, classLoader = classLoader, wholeClasspath = wholeClasspath))
|
JvmDependency(scriptCompilationClasspathFromContext(*libraries, classLoader = classLoader, wholeClasspath = wholeClasspath))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val JvmScriptDefinitionKeys.javaHome by PropertiesCollection.keyCopy(ScriptingEnvironment.jvm.javaHome)
|
||||||
|
|
||||||
|
@Suppress("unused")
|
||||||
|
val ScriptDefinitionKeys.jvm
|
||||||
|
get() = JvmScriptDefinitionBuilder
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -52,7 +52,7 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
|
|||||||
get() = emptyList()
|
get() = emptyList()
|
||||||
|
|
||||||
override val dependencyResolver: DependenciesResolver by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
override val dependencyResolver: DependenciesResolver by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
BridgeDependenciesResolver(scriptDefinition, null)
|
BridgeDependenciesResolver(scriptDefinition)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val acceptedAnnotations: List<KClass<out Annotation>> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
override val acceptedAnnotations: List<KClass<out Annotation>> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
|
|||||||
Reference in New Issue
Block a user