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 2d48a260172..0d7ee15c0b7 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/definitions/definitionFromAnnotation.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/definitions/definitionFromAnnotation.kt @@ -6,8 +6,6 @@ package kotlin.script.experimental.definitions import kotlin.reflect.KClass -import kotlin.reflect.full.createInstance -import kotlin.reflect.full.findAnnotation import kotlin.script.experimental.annotations.KotlinScript import kotlin.script.experimental.annotations.KotlinScriptFileExtension import kotlin.script.experimental.annotations.KotlinScriptProperties @@ -50,9 +48,21 @@ fun createScriptDefinitionFromAnnotatedBaseClass( include(scriptingPropsInstance(mainAnnotation.definition)) - baseClass.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann -> + baseClass.java.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann -> include(scriptingPropsInstance(ann.definition)) } } } +private inline fun KClass<*>.findAnnotation(): T? = + @Suppress("UNCHECKED_CAST") + this.java.annotations.firstOrNull { it is T } as T? + +private fun KClass.createInstance(): T { + // TODO: throw a meaningful exception + val noArgsConstructor = java.constructors.singleOrNull { it.parameters.isEmpty() } + ?: throw IllegalArgumentException("Class should have a single no-arg constructor: $this") + + @Suppress("UNCHECKED_CAST") + return noArgsConstructor.newInstance() as T +}