Clean up properties collection

This commit is contained in:
Ilya Chernikov
2018-08-21 15:26:39 +03:00
parent c2e6c0ed49
commit 01eca8bac8
15 changed files with 66 additions and 128 deletions
@@ -123,7 +123,7 @@ abstract class AbstractCustomScriptCodegenTest : CodegenTestCase() {
object TestScriptWithReceiversConfiguration : ScriptCompilationConfiguration( object TestScriptWithReceiversConfiguration : ScriptCompilationConfiguration(
{ {
implicitReceivers<String>() implicitReceivers(String::class)
}) })
@Suppress("unused") @Suppress("unused")
@@ -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(
@@ -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) {
@@ -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
} }
@@ -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(
@@ -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,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
}
@@ -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)
} }
@@ -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()
@@ -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())
@@ -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"
@@ -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
@@ -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