Clean up properties collection
This commit is contained in:
@@ -123,7 +123,7 @@ abstract class AbstractCustomScriptCodegenTest : CodegenTestCase() {
|
|||||||
|
|
||||||
object TestScriptWithReceiversConfiguration : ScriptCompilationConfiguration(
|
object TestScriptWithReceiversConfiguration : ScriptCompilationConfiguration(
|
||||||
{
|
{
|
||||||
implicitReceivers<String>()
|
implicitReceivers(String::class)
|
||||||
})
|
})
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
|||||||
+1
-2
@@ -208,8 +208,7 @@ fun loadDefinitionsFromTemplates(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
template.annotations.firstIsInstanceOrNull<kotlin.script.experimental.annotations.KotlinScript>() != null -> {
|
template.annotations.firstIsInstanceOrNull<kotlin.script.experimental.annotations.KotlinScript>() != null -> {
|
||||||
val hostConfiguration = ScriptingHostConfiguration {
|
val hostConfiguration = ScriptingHostConfiguration(defaultJvmScriptingEnvironment) {
|
||||||
include(defaultJvmScriptingEnvironment)
|
|
||||||
configurationDependencies(JvmDependency(classpath))
|
configurationDependencies(JvmDependency(classpath))
|
||||||
}
|
}
|
||||||
KotlinScriptDefinitionAdapterFromNewAPI(
|
KotlinScriptDefinitionAdapterFromNewAPI(
|
||||||
|
|||||||
+7
-8
@@ -29,8 +29,7 @@ abstract class MyScriptWithMavenDeps {
|
|||||||
|
|
||||||
object MyScriptCompilationConfiguration : ScriptCompilationConfiguration(
|
object MyScriptCompilationConfiguration : ScriptCompilationConfiguration(
|
||||||
{
|
{
|
||||||
defaultImports<DependsOn>()
|
defaultImports(DependsOn::class, Repository::class)
|
||||||
defaultImports(Repository::class)
|
|
||||||
jvm {
|
jvm {
|
||||||
dependenciesFromCurrentContext(
|
dependenciesFromCurrentContext(
|
||||||
"scripting-jvm-maven-deps", // script library jar name
|
"scripting-jvm-maven-deps", // script library jar name
|
||||||
@@ -49,9 +48,9 @@ object MyScriptCompilationConfiguration : ScriptCompilationConfiguration(
|
|||||||
|
|
||||||
private val resolver = FilesAndMavenResolver()
|
private val resolver = FilesAndMavenResolver()
|
||||||
|
|
||||||
fun myConfigureOnAnnotations(script: ScriptConfigurationRefinementContext): ResultWithDiagnostics<ScriptCompilationConfiguration?> {
|
fun myConfigureOnAnnotations(context: ScriptConfigurationRefinementContext): ResultWithDiagnostics<ScriptCompilationConfiguration> {
|
||||||
val annotations = script.collectedData?.get(ScriptCollectedData.foundAnnotations)?.takeIf { it.isNotEmpty() }
|
val annotations = context.collectedData?.get(ScriptCollectedData.foundAnnotations)?.takeIf { it.isNotEmpty() }
|
||||||
?: return null.asSuccess()
|
?: return context.compilationConfiguration.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,10 +62,10 @@ fun myConfigureOnAnnotations(script: ScriptConfigurationRefinementContext): Resu
|
|||||||
}
|
}
|
||||||
return try {
|
return try {
|
||||||
val newDepsFromResolver = resolver.resolve(scriptContents, emptyMap(), ::report, null).get()
|
val newDepsFromResolver = resolver.resolve(scriptContents, emptyMap(), ::report, null).get()
|
||||||
?: return null.asSuccess(diagnostics)
|
?: return context.compilationConfiguration.asSuccess(diagnostics)
|
||||||
val resolvedClasspath = newDepsFromResolver.classpath.toList().takeIf { it.isNotEmpty() }
|
val resolvedClasspath = newDepsFromResolver.classpath.toList().takeIf { it.isNotEmpty() }
|
||||||
?: return null.asSuccess(diagnostics)
|
?: return context.compilationConfiguration.asSuccess(diagnostics)
|
||||||
ScriptCompilationConfiguration(script.compilationConfiguration) {
|
ScriptCompilationConfiguration(context.compilationConfiguration) {
|
||||||
dependencies.append(JvmDependency(resolvedClasspath))
|
dependencies.append(JvmDependency(resolvedClasspath))
|
||||||
}.asSuccess(diagnostics)
|
}.asSuccess(diagnostics)
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
|
|||||||
+1
-3
@@ -6,10 +6,8 @@
|
|||||||
package org.jetbrains.kotlin.script.examples.jvm.simple
|
package org.jetbrains.kotlin.script.examples.jvm.simple
|
||||||
|
|
||||||
import kotlin.script.experimental.annotations.KotlinScript
|
import kotlin.script.experimental.annotations.KotlinScript
|
||||||
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
|
|
||||||
|
|
||||||
@KotlinScript
|
@KotlinScript(extension = "simplescript.kts")
|
||||||
@KotlinScriptFileExtension("simplescript.kts")
|
|
||||||
abstract class MyScript {
|
abstract class MyScript {
|
||||||
// abstract fun body(vararg args: String): Int
|
// abstract fun body(vararg args: String): Int
|
||||||
}
|
}
|
||||||
|
|||||||
-11
@@ -23,14 +23,3 @@ annotation class KotlinScript(
|
|||||||
val compilationConfiguration: KClass<out ScriptCompilationConfiguration> = ScriptCompilationConfiguration.Default::class // object or class filled in 0-ary constructor
|
val compilationConfiguration: KClass<out ScriptCompilationConfiguration> = ScriptCompilationConfiguration.Default::class // object or class filled in 0-ary constructor
|
||||||
)
|
)
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
annotation class KotlinScriptFileExtension(
|
|
||||||
val extension: String
|
|
||||||
)
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
annotation class KotlinScriptProperties(
|
|
||||||
val compilationConfiguration: KClass<out ScriptCompilationConfiguration> // object or class filled in 0-ary constructor
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -98,7 +98,8 @@ class RefineConfigurationBuilder : PropertiesCollection.Builder() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typealias RefineScriptCompilationConfigurationHandler = (ScriptConfigurationRefinementContext) -> ResultWithDiagnostics<ScriptCompilationConfiguration?>
|
typealias RefineScriptCompilationConfigurationHandler =
|
||||||
|
(ScriptConfigurationRefinementContext) -> ResultWithDiagnostics<ScriptCompilationConfiguration>
|
||||||
|
|
||||||
// to make it "hasheable" for cashing
|
// to make it "hasheable" for cashing
|
||||||
class RefineConfigurationBeforeParsingData(
|
class RefineConfigurationBeforeParsingData(
|
||||||
|
|||||||
+11
-12
@@ -7,8 +7,6 @@ package kotlin.script.experimental.host
|
|||||||
|
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import kotlin.script.experimental.annotations.KotlinScript
|
import kotlin.script.experimental.annotations.KotlinScript
|
||||||
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
|
|
||||||
import kotlin.script.experimental.annotations.KotlinScriptProperties
|
|
||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
|
|
||||||
private const val ERROR_MSG_PREFIX = "Unable to construct script definition: "
|
private const val ERROR_MSG_PREFIX = "Unable to construct script definition: "
|
||||||
@@ -37,22 +35,23 @@ fun createScriptCompilationConfigurationFromAnnotatedBaseClass(
|
|||||||
val mainAnnotation = baseClass.findAnnotation<KotlinScript>()
|
val mainAnnotation = baseClass.findAnnotation<KotlinScript>()
|
||||||
?: throw IllegalArgumentException("${ERROR_MSG_PREFIX}Expecting KotlinScript annotation on the $baseClass")
|
?: throw IllegalArgumentException("${ERROR_MSG_PREFIX}Expecting KotlinScript annotation on the $baseClass")
|
||||||
|
|
||||||
fun scriptingPropsInstance(kclass: KClass<out ScriptCompilationConfiguration>): ScriptCompilationConfiguration = try {
|
fun scriptConfigInstance(kclass: KClass<out ScriptCompilationConfiguration>): ScriptCompilationConfiguration = try {
|
||||||
kclass.objectInstance ?: kclass.createInstance()
|
kclass.objectInstance ?: kclass.createInstance()
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
throw IllegalArgumentException(ILLEGAL_CONFIG_ANN_ARG, e)
|
throw IllegalArgumentException(ILLEGAL_CONFIG_ANN_ARG, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ScriptCompilationConfiguration {
|
return ScriptCompilationConfiguration(scriptConfigInstance(mainAnnotation.compilationConfiguration)) {
|
||||||
baseClass(loadedBaseClassType)
|
if (baseClass() == null) {
|
||||||
fileExtension(baseClass.findAnnotation<KotlinScriptFileExtension>()?.extension ?: mainAnnotation.extension)
|
baseClass(loadedBaseClassType)
|
||||||
displayName(mainAnnotation.name)
|
|
||||||
|
|
||||||
include(scriptingPropsInstance(mainAnnotation.compilationConfiguration))
|
|
||||||
|
|
||||||
baseClass.java.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann ->
|
|
||||||
include(scriptingPropsInstance(ann.compilationConfiguration))
|
|
||||||
}
|
}
|
||||||
|
if (fileExtension() == null) {
|
||||||
|
fileExtension(mainAnnotation.extension)
|
||||||
|
}
|
||||||
|
if (displayName() == null) {
|
||||||
|
displayName(mainAnnotation.name)
|
||||||
|
}
|
||||||
|
|
||||||
body()
|
body()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-48
@@ -10,7 +10,7 @@ import kotlin.reflect.KProperty
|
|||||||
import kotlin.reflect.KType
|
import kotlin.reflect.KType
|
||||||
import kotlin.script.experimental.api.KotlinType
|
import kotlin.script.experimental.api.KotlinType
|
||||||
|
|
||||||
open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
open class PropertiesCollection(private val properties: Map<Key<*>, Any> = emptyMap()) {
|
||||||
|
|
||||||
data class Key<T>(val name: String, val defaultValue: T? = null)
|
data class Key<T>(val name: String, val defaultValue: T? = null)
|
||||||
|
|
||||||
@@ -27,6 +27,9 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
|||||||
operator fun <T> get(key: PropertiesCollection.Key<T>): T? =
|
operator fun <T> get(key: PropertiesCollection.Key<T>): T? =
|
||||||
properties[key]?.let { it as T } ?: key.defaultValue
|
properties[key]?.let { it as T } ?: key.defaultValue
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
fun <T> getNoDefault(key: PropertiesCollection.Key<T>): T? =
|
||||||
|
properties[key]?.let { it as T }
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun <T> key(defaultValue: T? = null) = PropertyKeyDelegate(defaultValue)
|
fun <T> key(defaultValue: T? = null) = PropertyKeyDelegate(defaultValue)
|
||||||
@@ -41,7 +44,8 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
|||||||
baseProperties.forEach { putAll(it.properties) }
|
baseProperties.forEach { putAll(it.properties) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// generic builder for all properties
|
// generic for all properties
|
||||||
|
|
||||||
operator fun <T : Any> PropertiesCollection.Key<T>.invoke(v: T) {
|
operator fun <T : Any> PropertiesCollection.Key<T>.invoke(v: T) {
|
||||||
data[this] = v
|
data[this] = v
|
||||||
}
|
}
|
||||||
@@ -49,7 +53,7 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
|||||||
// generic for lists
|
// generic for lists
|
||||||
|
|
||||||
operator fun <T> PropertiesCollection.Key<in List<T>>.invoke(vararg vals: T) {
|
operator fun <T> PropertiesCollection.Key<in List<T>>.invoke(vararg vals: T) {
|
||||||
append(vals.asIterable())
|
data[this] = vals.toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
// generic for maps:
|
// generic for maps:
|
||||||
@@ -60,21 +64,11 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
|||||||
|
|
||||||
// for strings and list of strings that could be converted from other types
|
// for strings and list of strings that could be converted from other types
|
||||||
|
|
||||||
@JvmName("invoke_string_fqn_from_generic")
|
|
||||||
inline operator fun <reified K> PropertiesCollection.Key<String>.invoke() {
|
|
||||||
data[this] = K::class.java.name
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmName("invoke_string_fqn_from_reflected_class")
|
@JvmName("invoke_string_fqn_from_reflected_class")
|
||||||
operator fun PropertiesCollection.Key<String>.invoke(kclass: KClass<*>) {
|
operator fun PropertiesCollection.Key<String>.invoke(kclass: KClass<*>) {
|
||||||
data[this] = kclass.java.name
|
data[this] = kclass.java.name
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmName("invoke_string_list_fqn_from_generic")
|
|
||||||
inline operator fun <reified K> PropertiesCollection.Key<in List<String>>.invoke() {
|
|
||||||
append(K::class.java.name)
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmName("invoke_string_list_fqn_from_reflected_class")
|
@JvmName("invoke_string_list_fqn_from_reflected_class")
|
||||||
operator fun PropertiesCollection.Key<in List<String>>.invoke(vararg kclasses: KClass<*>) {
|
operator fun PropertiesCollection.Key<in List<String>>.invoke(vararg kclasses: KClass<*>) {
|
||||||
append(kclasses.map { it.java.name })
|
append(kclasses.map { it.java.name })
|
||||||
@@ -82,10 +76,6 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
|||||||
|
|
||||||
// for KotlinType:
|
// for KotlinType:
|
||||||
|
|
||||||
inline operator fun <reified K> PropertiesCollection.Key<KotlinType>.invoke() {
|
|
||||||
data[this] = KotlinType(K::class)
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun PropertiesCollection.Key<KotlinType>.invoke(kclass: KClass<*>) {
|
operator fun PropertiesCollection.Key<KotlinType>.invoke(kclass: KClass<*>) {
|
||||||
data[this] = KotlinType(kclass)
|
data[this] = KotlinType(kclass)
|
||||||
}
|
}
|
||||||
@@ -100,11 +90,6 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
|||||||
|
|
||||||
// for list of KotlinTypes
|
// for list of KotlinTypes
|
||||||
|
|
||||||
@JvmName("invoke_kotlintype_list_from_generic")
|
|
||||||
inline operator fun <reified K> PropertiesCollection.Key<in List<KotlinType>>.invoke() {
|
|
||||||
append(KotlinType(K::class))
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun PropertiesCollection.Key<List<KotlinType>>.invoke(vararg classes: KClass<*>) {
|
operator fun PropertiesCollection.Key<List<KotlinType>>.invoke(vararg classes: KClass<*>) {
|
||||||
append(classes.map { KotlinType(it) })
|
append(classes.map { KotlinType(it) })
|
||||||
}
|
}
|
||||||
@@ -141,7 +126,9 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
private operator fun <T : Any> get(key: PropertiesCollection.Key<in T>): T? = data[key]?.let { it as T }
|
operator fun <T : Any> get(key: PropertiesCollection.Key<in T>): T? = data[key]?.let { it as T }
|
||||||
|
|
||||||
|
operator fun <T : Any> PropertiesCollection.Key<T>.invoke(): T? = get(this)
|
||||||
|
|
||||||
// appenders to list and map properties
|
// appenders to list and map properties
|
||||||
|
|
||||||
@@ -167,39 +154,14 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
|
|||||||
data[this] = newValues
|
data[this] = newValues
|
||||||
}
|
}
|
||||||
|
|
||||||
// include other properties
|
|
||||||
fun include(other: PropertiesCollection?) {
|
|
||||||
other?.properties?.let { data.putAll(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// include another builder
|
// include another builder
|
||||||
operator fun <T : Builder> T.invoke(body: T.() -> Unit) {
|
operator fun <T : Builder> T.invoke(body: T.() -> Unit) {
|
||||||
this.body()
|
this.body()
|
||||||
this@Builder.data.putAll(this.data)
|
this@Builder.data.putAll(this.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// a class for extending properties
|
|
||||||
interface BuilderExtension<T : Builder> {
|
|
||||||
fun get(): T
|
|
||||||
}
|
|
||||||
|
|
||||||
// include another builder extension
|
|
||||||
operator fun <T : Builder> BuilderExtension<T>.invoke(body: T.() -> Unit) {
|
|
||||||
val builder = this.get().apply(body)
|
|
||||||
this@Builder.data.putAll(builder.data)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> PropertiesCollection.getOrError(key: PropertiesCollection.Key<T>): T =
|
fun <T> PropertiesCollection.getOrError(key: PropertiesCollection.Key<T>): T =
|
||||||
get(key) ?: throw IllegalArgumentException("Unknown key $key")
|
get(key) ?: throw IllegalArgumentException("Unknown key $key")
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
fun <T> getFirstFromChainOrNull(key: PropertiesCollection.Key<T>, vararg propertyCollections: PropertiesCollection?): T? {
|
|
||||||
for (collection in propertyCollections) {
|
|
||||||
val value = collection?.properties?.get(key)
|
|
||||||
if (value != null) return value as T
|
|
||||||
}
|
|
||||||
return key.defaultValue
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
+19
-18
@@ -48,7 +48,6 @@ import kotlin.script.experimental.jvm.jvm
|
|||||||
import kotlin.script.experimental.jvmhost.JvmScriptEvaluationEnvironment
|
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.getOrError
|
import kotlin.script.experimental.util.getOrError
|
||||||
|
|
||||||
class KJvmCompiledScript<out ScriptBase : Any>(
|
class KJvmCompiledScript<out ScriptBase : Any>(
|
||||||
@@ -57,23 +56,24 @@ class KJvmCompiledScript<out ScriptBase : Any>(
|
|||||||
private val scriptClassFQName: String
|
private val scriptClassFQName: String
|
||||||
) : CompiledScript<ScriptBase> {
|
) : CompiledScript<ScriptBase> {
|
||||||
|
|
||||||
override suspend fun instantiate(scriptEvaluationConfiguration: ScriptEvaluationConfiguration?): ResultWithDiagnostics<ScriptBase> = try {
|
override suspend fun instantiate(scriptEvaluationConfiguration: ScriptEvaluationConfiguration?): ResultWithDiagnostics<ScriptBase> =
|
||||||
val baseClassLoader = scriptEvaluationConfiguration?.get(JvmScriptEvaluationEnvironment.baseClassLoader)
|
try {
|
||||||
?: Thread.currentThread().contextClassLoader
|
val baseClassLoader = scriptEvaluationConfiguration?.get(JvmScriptEvaluationEnvironment.baseClassLoader)
|
||||||
val dependencies = compilationConfiguration[ScriptCompilationConfiguration.dependencies]
|
?: Thread.currentThread().contextClassLoader
|
||||||
?.flatMap { (it as? JvmDependency)?.classpath?.map { it.toURI().toURL() } ?: emptyList() }
|
val dependencies = compilationConfiguration[ScriptCompilationConfiguration.dependencies]
|
||||||
// TODO: previous dependencies and classloaders should be taken into account here
|
?.flatMap { (it as? JvmDependency)?.classpath?.map { it.toURI().toURL() } ?: emptyList() }
|
||||||
val classLoaderWithDeps =
|
// TODO: previous dependencies and classloaders should be taken into account here
|
||||||
if (dependencies == null) baseClassLoader
|
val classLoaderWithDeps =
|
||||||
else URLClassLoader(dependencies.toTypedArray(), baseClassLoader)
|
if (dependencies == null) baseClassLoader
|
||||||
val classLoader = GeneratedClassLoader(generationState.factory, classLoaderWithDeps)
|
else URLClassLoader(dependencies.toTypedArray(), baseClassLoader)
|
||||||
|
val classLoader = GeneratedClassLoader(generationState.factory, classLoaderWithDeps)
|
||||||
|
|
||||||
val clazz = classLoader.loadClass(scriptClassFQName)
|
val clazz = classLoader.loadClass(scriptClassFQName)
|
||||||
(clazz as? ScriptBase)?.asSuccess()
|
(clazz as? ScriptBase)?.asSuccess()
|
||||||
?: ResultWithDiagnostics.Failure("Compiled class expected to be a subclass of the <ScriptBase>, but got ${clazz.javaClass.name}".asErrorDiagnostics())
|
?: ResultWithDiagnostics.Failure("Compiled class expected to be a subclass of the <ScriptBase>, but got ${clazz.javaClass.name}".asErrorDiagnostics())
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
ResultWithDiagnostics.Failure(ScriptDiagnostic("Unable to instantiate class $scriptClassFQName", exception = e))
|
ResultWithDiagnostics.Failure(ScriptDiagnostic("Unable to instantiate class $scriptClassFQName", exception = e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class KJvmCompilerImpl(val hostConfiguration: ScriptingHostConfiguration) : KJvmCompilerProxy {
|
class KJvmCompilerImpl(val hostConfiguration: ScriptingHostConfiguration) : KJvmCompilerProxy {
|
||||||
@@ -112,7 +112,8 @@ class KJvmCompilerImpl(val hostConfiguration: ScriptingHostConfiguration) : KJvm
|
|||||||
put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true)
|
put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true)
|
||||||
|
|
||||||
var isModularJava = false
|
var isModularJava = false
|
||||||
getFirstFromChainOrNull(ScriptCompilationConfiguration.jvm.javaHome, updatedConfiguration, hostConfiguration)?.let {
|
(updatedConfiguration.getNoDefault(ScriptCompilationConfiguration.jvm.javaHome)
|
||||||
|
?: hostConfiguration[ScriptingHostConfiguration.jvm.javaHome])?.let {
|
||||||
put(JVMConfigurationKeys.JDK_HOME, it)
|
put(JVMConfigurationKeys.JDK_HOME, it)
|
||||||
isModularJava = CoreJrtFileSystem.isModularJdk(it)
|
isModularJava = CoreJrtFileSystem.isModularJdk(it)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -9,9 +9,7 @@ import kotlin.script.experimental.host.ScriptingHostConfiguration
|
|||||||
import kotlin.script.experimental.jvm.defaultJvmScriptingEnvironment
|
import kotlin.script.experimental.jvm.defaultJvmScriptingEnvironment
|
||||||
|
|
||||||
fun ScriptingHostConfiguration.withDefaults(): ScriptingHostConfiguration =
|
fun ScriptingHostConfiguration.withDefaults(): ScriptingHostConfiguration =
|
||||||
if (this == defaultJvmScriptingEnvironment || defaultJvmScriptingEnvironment.properties.all {
|
if (this == defaultJvmScriptingEnvironment) {
|
||||||
this.properties.containsKey(it.key)
|
|
||||||
}) {
|
|
||||||
this
|
this
|
||||||
} else {
|
} else {
|
||||||
ScriptingHostConfiguration(defaultJvmScriptingEnvironment, this)
|
ScriptingHostConfiguration(defaultJvmScriptingEnvironment, this)
|
||||||
|
|||||||
@@ -19,9 +19,7 @@ data class JvmDependency(val classpath: List<File>) : ScriptDependency {
|
|||||||
interface JvmScriptCompilationConfigurationKeys
|
interface JvmScriptCompilationConfigurationKeys
|
||||||
|
|
||||||
open class JvmScriptCompilationConfigurationBuilder : PropertiesCollection.Builder(), JvmScriptCompilationConfigurationKeys {
|
open class JvmScriptCompilationConfigurationBuilder : PropertiesCollection.Builder(), JvmScriptCompilationConfigurationKeys {
|
||||||
companion object : PropertiesCollection.Builder.BuilderExtension<JvmScriptCompilationConfigurationBuilder>, JvmScriptCompilationConfigurationKeys {
|
companion object : JvmScriptCompilationConfigurationKeys
|
||||||
override fun get() = JvmScriptCompilationConfigurationBuilder()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun JvmScriptCompilationConfigurationBuilder.dependenciesFromCurrentContext(vararg libraries: String, wholeClasspath: Boolean = false) {
|
fun JvmScriptCompilationConfigurationBuilder.dependenciesFromCurrentContext(vararg libraries: String, wholeClasspath: Boolean = false) {
|
||||||
@@ -42,5 +40,5 @@ val JvmScriptCompilationConfigurationKeys.javaHome by PropertiesCollection.keyCo
|
|||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
val ScriptCompilationConfigurationKeys.jvm
|
val ScriptCompilationConfigurationKeys.jvm
|
||||||
get() = JvmScriptCompilationConfigurationBuilder
|
get() = JvmScriptCompilationConfigurationBuilder()
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -16,16 +16,14 @@ interface JvmScriptingHostConfigurationKeys
|
|||||||
|
|
||||||
open class JvmScriptingHostConfigurationBuilder : JvmScriptingHostConfigurationKeys, PropertiesCollection.Builder() {
|
open class JvmScriptingHostConfigurationBuilder : JvmScriptingHostConfigurationKeys, PropertiesCollection.Builder() {
|
||||||
|
|
||||||
companion object : PropertiesCollection.Builder.BuilderExtension<JvmScriptingHostConfigurationBuilder>, JvmScriptingHostConfigurationKeys {
|
companion object : JvmScriptingHostConfigurationKeys
|
||||||
override fun get() = JvmScriptingHostConfigurationBuilder()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val JvmScriptingHostConfigurationKeys.javaHome by PropertiesCollection.key<File>(File(System.getProperty("java.home")))
|
val JvmScriptingHostConfigurationKeys.javaHome by PropertiesCollection.key<File>(File(System.getProperty("java.home")))
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
val ScriptingHostConfigurationKeys.jvm
|
val ScriptingHostConfigurationKeys.jvm
|
||||||
get() = JvmScriptingHostConfigurationBuilder
|
get() = JvmScriptingHostConfigurationBuilder()
|
||||||
|
|
||||||
val defaultJvmScriptingEnvironment = ScriptingHostConfiguration {
|
val defaultJvmScriptingEnvironment = ScriptingHostConfiguration {
|
||||||
getScriptingClass(JvmGetScriptingClass())
|
getScriptingClass(JvmGetScriptingClass())
|
||||||
|
|||||||
+4
-8
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
|||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.script.experimental.annotations.KotlinScript
|
import kotlin.script.experimental.annotations.KotlinScript
|
||||||
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
|
|
||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.host.ScriptingHostConfiguration
|
import kotlin.script.experimental.host.ScriptingHostConfiguration
|
||||||
import kotlin.script.experimental.host.configurationDependencies
|
import kotlin.script.experimental.host.configurationDependencies
|
||||||
@@ -37,9 +36,8 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
|
|||||||
) : this(loadAnnotationsFromClass(classBytes), className, classpath, messageCollector)
|
) : this(loadAnnotationsFromClass(classBytes), className, classpath, messageCollector)
|
||||||
|
|
||||||
override val hostConfiguration: ScriptingHostConfiguration by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
override val hostConfiguration: ScriptingHostConfiguration by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
ScriptingHostConfiguration {
|
ScriptingHostConfiguration(defaultJvmScriptingEnvironment) {
|
||||||
include(defaultJvmScriptingEnvironment)
|
configurationDependencies.append(JvmDependency(classpath))
|
||||||
configurationDependencies(JvmDependency(classpath))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,10 +65,8 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val scriptFileExtensionWithDot: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
override val scriptFileExtensionWithDot: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
val extFromAnn = (
|
val extFromAnn = annotationsFromAsm.find { it.name == KotlinScript::class.simpleName }?.args
|
||||||
annotationsFromAsm.find { it.name == KotlinScriptFileExtension::class.simpleName!! }?.args
|
?.find { it.name == "extension" }?.value
|
||||||
?: annotationsFromAsm.find { it.name == KotlinScript::class.simpleName }?.args
|
|
||||||
)?.find { it.name == "extension" }?.value
|
|
||||||
val ext = extFromAnn
|
val ext = extFromAnn
|
||||||
?: scriptCompilationConfiguration.let {
|
?: scriptCompilationConfiguration.let {
|
||||||
it[ScriptCompilationConfiguration.fileExtension] ?: "kts"
|
it[ScriptCompilationConfiguration.fileExtension] ?: "kts"
|
||||||
|
|||||||
Vendored
+3
-3
@@ -3,10 +3,10 @@ import kotlin.script.experimental.annotations.*
|
|||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.util.*
|
import kotlin.script.experimental.util.*
|
||||||
|
|
||||||
object TestScriptWithReceiversDefinition : ScriptDefinition(
|
object TestScriptWithReceiversDefinition : ScriptCompilationConfiguration(
|
||||||
{
|
{
|
||||||
implicitReceivers<String>()
|
implicitReceivers(String::class)
|
||||||
})
|
})
|
||||||
|
|
||||||
@KotlinScript(extension = "1.kts", definition = TestScriptWithReceiversDefinition::class)
|
@KotlinScript(extension = "1.kts", compilationConfiguration = TestScriptWithReceiversDefinition::class)
|
||||||
abstract class TestScriptWithReceivers
|
abstract class TestScriptWithReceivers
|
||||||
|
|||||||
Vendored
+2
-2
@@ -3,11 +3,11 @@ import kotlin.script.experimental.annotations.*
|
|||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.util.*
|
import kotlin.script.experimental.util.*
|
||||||
|
|
||||||
object TestScriptWithSimpleEnvVarsDefinition : ScriptDefinition(
|
object TestScriptWithSimpleEnvVarsDefinition : ScriptCompilationConfiguration(
|
||||||
{
|
{
|
||||||
providedProperties("stringVar1" to String::class)
|
providedProperties("stringVar1" to String::class)
|
||||||
})
|
})
|
||||||
|
|
||||||
@KotlinScript(extension = "2.kts", definition = TestScriptWithSimpleEnvVarsDefinition::class)
|
@KotlinScript(extension = "2.kts", compilationConfiguration = TestScriptWithSimpleEnvVarsDefinition::class)
|
||||||
abstract class TestScriptWithSimpleEnvVars
|
abstract class TestScriptWithSimpleEnvVars
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user