diff --git a/libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt b/libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt index 55ceba5a0ff..b08b49750a6 100644 --- a/libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt +++ b/libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt @@ -12,20 +12,19 @@ import java.io.File import kotlin.script.dependencies.ScriptContents import kotlin.script.dependencies.ScriptDependenciesResolver 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.jvm.* import kotlin.script.experimental.misc.invoke -@KotlinScript -@KotlinScriptFileExtension("scriptwithdeps.kts") -@KotlinScriptProperties(MyConfiguration::class) +@KotlinScript( + extension = "scriptwithdeps.kts", + properties = MyScriptProperties::class +) abstract class MyScriptWithMavenDeps { // abstract fun body(vararg args: String): Int } -object MyConfiguration : ScriptingProperties() { +object MyScriptProperties : ScriptingProperties() { init { include(jvmJavaHomeScriptingProperties) scriptDefinition { diff --git a/libraries/scripting/common/src/kotlin/script/experimental/annotations/scriptAnnotations.kt b/libraries/scripting/common/src/kotlin/script/experimental/annotations/scriptAnnotations.kt index f82dbda8885..44499d16d2b 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/annotations/scriptAnnotations.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/annotations/scriptAnnotations.kt @@ -18,7 +18,9 @@ import kotlin.script.experimental.api.ScriptingProperties @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) annotation class KotlinScript( - val name: String = "Kotlin script" + val name: String = "Kotlin script", + val extension: String = "kts", + val properties: KClass = ScriptingProperties::class // object or class filled in 0-ary constructor ) @Target(AnnotationTarget.CLASS) diff --git a/libraries/scripting/common/src/kotlin/script/experimental/definitions/definitionFromAnnotation.kt b/libraries/scripting/common/src/kotlin/script/experimental/definitions/definitionFromAnnotation.kt index 4a2ef14449b..98a52adb037 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/definitions/definitionFromAnnotation.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/definitions/definitionFromAnnotation.kt @@ -40,9 +40,10 @@ fun createScriptDefinitionFromAnnotatedBaseClass( ?: throw IllegalArgumentException("${ERROR_MSG_PREFIX}Expecting KotlinScript annotation on the $baseClass") val propertiesData = hashMapOf, Any?>(ScriptDefinitionProperties.baseClass to baseClassType) - baseClass.findAnnotation()?.let { - propertiesData[ScriptDefinitionProperties.fileExtension] = it.extension - } + + propertiesData[ScriptDefinitionProperties.fileExtension] = + baseClass.findAnnotation()?.let { it.extension } + ?: mainAnnotation.extension propertiesData += ScriptDefinitionProperties.name to mainAnnotation.name baseClass.annotations.filterIsInstance(KotlinScriptPropertiesFromList::class.java).forEach { ann -> val params = try { @@ -58,15 +59,18 @@ fun createScriptDefinitionFromAnnotatedBaseClass( } } } - baseClass.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann -> - val params = try { - ann.definitionProperties.objectInstance ?: ann.definitionProperties.createInstance() - } catch (e: Throwable) { - throw IllegalArgumentException(ILLEGAL_CONFIG_ANN_ARG, e) - } - propertiesData.putAll(params.data) - // TODO: chaining is lost here, fix it + + fun scriptingPropsInstance(kclass: KClass): ScriptingProperties = try { + kclass.objectInstance ?: kclass.createInstance() + } catch (e: Throwable) { + throw IllegalArgumentException(ILLEGAL_CONFIG_ANN_ARG, e) } + + baseClass.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann -> + propertiesData.putAll(scriptingPropsInstance(ann.definitionProperties).data) + } + // TODO: chaining is lost here and above, fix it + propertiesData.putAll(scriptingPropsInstance(mainAnnotation.properties).data) return ScriptingEnvironment.createOptimized(null, propertiesData) } diff --git a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/LazyScriptDefinitionFromDiscoveredClass.kt b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/LazyScriptDefinitionFromDiscoveredClass.kt index c1dd6bf4c8c..7e97edd7907 100644 --- a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/LazyScriptDefinitionFromDiscoveredClass.kt +++ b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/LazyScriptDefinitionFromDiscoveredClass.kt @@ -66,6 +66,8 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor( override val scriptFileExtensionWithDot: String by lazy(LazyThreadSafetyMode.PUBLICATION) { val ext = annotationsFromAsm.find { it.name == KotlinScriptFileExtension::class.simpleName!! }?.args?.first() + // TODO: check whether it actually works + ?: annotationsFromAsm.find { it.name == KotlinScript::class.simpleName }?.args?.get(1) ?: scriptDefinition.let { it.getOrNull(ScriptDefinitionProperties.fileExtension) ?: "kts" }