Add properties builders to the dsl, implement a builder for refineConfiguration
This commit is contained in:
+5
-5
@@ -15,11 +15,9 @@ import kotlin.script.dependencies.ScriptDependenciesResolver
|
|||||||
import kotlin.script.experimental.annotations.KotlinScript
|
import kotlin.script.experimental.annotations.KotlinScript
|
||||||
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
|
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
|
||||||
import kotlin.script.experimental.annotations.KotlinScriptProperties
|
import kotlin.script.experimental.annotations.KotlinScriptProperties
|
||||||
import kotlin.script.experimental.annotations.KotlinScriptPropertiesFromList
|
|
||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.jvm.*
|
import kotlin.script.experimental.jvm.*
|
||||||
import kotlin.script.experimental.misc.invoke
|
import kotlin.script.experimental.misc.invoke
|
||||||
import kotlin.script.experimental.util.TypedKey
|
|
||||||
|
|
||||||
@KotlinScript
|
@KotlinScript
|
||||||
@KotlinScriptFileExtension("scriptwithdeps.kts")
|
@KotlinScriptFileExtension("scriptwithdeps.kts")
|
||||||
@@ -42,13 +40,15 @@ object MyConfiguration : ScriptingProperties() {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
refineConfiguration(MyConfigurator())
|
refineConfiguration {
|
||||||
refineConfigurationOnAnnotations(DependsOn::class, Repository::class)
|
handler(MyConfigurator())
|
||||||
|
onAnnotations(DependsOn::class, Repository::class)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyConfigurator : RefineScriptCompilationConfiguration {
|
class MyConfigurator : RefineScriptCompilationConfigurationHandler {
|
||||||
|
|
||||||
private val resolver = FilesAndMavenResolver()
|
private val resolver = FilesAndMavenResolver()
|
||||||
|
|
||||||
|
|||||||
@@ -6,12 +6,23 @@
|
|||||||
package kotlin.script.experimental.api
|
package kotlin.script.experimental.api
|
||||||
|
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
import kotlin.reflect.KType
|
import kotlin.reflect.KType
|
||||||
import kotlin.script.experimental.util.ChainedPropertyBag
|
import kotlin.script.experimental.util.ChainedPropertyBag
|
||||||
import kotlin.script.experimental.util.TypedKey
|
import kotlin.script.experimental.util.TypedKey
|
||||||
|
|
||||||
interface PropertiesGroup
|
interface PropertiesGroup
|
||||||
|
|
||||||
|
|
||||||
|
open class PropertiesBuilder(val props: ScriptingProperties)
|
||||||
|
|
||||||
|
class PropertiesBuilderDelegate<T: PropertiesBuilder>(val kclass: KClass<T>) {
|
||||||
|
operator fun getValue(thisRef: Any?, property: KProperty<*>): KClass<T> = kclass
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified T : PropertiesBuilder> propertiesBuilder() = PropertiesBuilderDelegate(T::class)
|
||||||
|
|
||||||
|
|
||||||
open class ScriptingProperties(body: ScriptingProperties.() -> Unit = {}) {
|
open class ScriptingProperties(body: ScriptingProperties.() -> Unit = {}) {
|
||||||
|
|
||||||
var parentPropertiesBag: ChainedPropertyBag? = null
|
var parentPropertiesBag: ChainedPropertyBag? = null
|
||||||
@@ -35,6 +46,12 @@ open class ScriptingProperties(body: ScriptingProperties.() -> Unit = {}) {
|
|||||||
|
|
||||||
inline operator fun <T : PropertiesGroup> T.invoke(body: T.() -> Unit) = body()
|
inline operator fun <T : PropertiesGroup> T.invoke(body: T.() -> Unit) = body()
|
||||||
|
|
||||||
|
// generic invoke for properties builder - for extending dsl with complex builders
|
||||||
|
|
||||||
|
inline operator fun <reified T : PropertiesBuilder> KClass<T>.invoke(body: T.() -> Unit) {
|
||||||
|
constructors.first().call(this@ScriptingProperties).body()
|
||||||
|
}
|
||||||
|
|
||||||
// chaining:
|
// chaining:
|
||||||
|
|
||||||
private fun chain(propsBag: ChainedPropertyBag?, propsBuilder: ScriptingProperties?, replaceParent: Boolean) {
|
private fun chain(propsBag: ChainedPropertyBag?, propsBuilder: ScriptingProperties?, replaceParent: Boolean) {
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ object ProcessedScriptDataProperties : PropertiesGroup {
|
|||||||
val foundFragments by typedKey<List<ScriptSourceNamedFragment>>()
|
val foundFragments by typedKey<List<ScriptSourceNamedFragment>>()
|
||||||
}
|
}
|
||||||
|
|
||||||
interface RefineScriptCompilationConfiguration {
|
interface RefineScriptCompilationConfigurationHandler {
|
||||||
suspend operator fun invoke(
|
suspend operator fun invoke(
|
||||||
scriptSource: ScriptSource,
|
scriptSource: ScriptSource,
|
||||||
configuration: ScriptCompileConfiguration,
|
configuration: ScriptCompileConfiguration,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
package kotlin.script.experimental.api
|
package kotlin.script.experimental.api
|
||||||
|
|
||||||
|
import kotlin.reflect.KClass
|
||||||
import kotlin.script.experimental.util.ChainedPropertyBag
|
import kotlin.script.experimental.util.ChainedPropertyBag
|
||||||
import kotlin.script.experimental.util.typedKey
|
import kotlin.script.experimental.util.typedKey
|
||||||
|
|
||||||
@@ -40,12 +41,59 @@ object ScriptDefinitionProperties : PropertiesGroup {
|
|||||||
|
|
||||||
val compilerOptions by typedKey<List<String>>() // Q: CommonCompilerOptions instead?
|
val compilerOptions by typedKey<List<String>>() // Q: CommonCompilerOptions instead?
|
||||||
|
|
||||||
val refineConfiguration by typedKey<RefineScriptCompilationConfiguration>() // dynamic configurator
|
val refineConfigurationHandler by typedKey<RefineScriptCompilationConfigurationHandler>() // dynamic configurator
|
||||||
|
|
||||||
val refineBeforeParsing by typedKey<Boolean>() // default: false
|
val refineConfigurationBeforeParsing by typedKey<Boolean>() // default: false
|
||||||
|
|
||||||
val refineConfigurationOnAnnotations by typedKey<List<KotlinType>>()
|
val refineConfigurationOnAnnotations by typedKey<List<KotlinType>>()
|
||||||
|
|
||||||
val refineConfigurationOnSections by typedKey<List<String>>()
|
val refineConfigurationOnSections by typedKey<List<String>>()
|
||||||
|
|
||||||
|
// DSL:
|
||||||
|
|
||||||
|
val refineConfiguration by propertiesBuilder<RefineConfigurationBuilder>()
|
||||||
|
}
|
||||||
|
|
||||||
|
// DSL --------------------
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
|
class RefineConfigurationBuilder(props: ScriptingProperties) : PropertiesBuilder(props) {
|
||||||
|
|
||||||
|
inline operator fun invoke(body: RefineConfigurationBuilder.() -> Unit) {
|
||||||
|
body()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun handler(fn: RefineScriptCompilationConfigurationHandler) {
|
||||||
|
props.data[ScriptDefinitionProperties.refineConfigurationHandler] = fn
|
||||||
|
}
|
||||||
|
|
||||||
|
fun beforeParsing(value: Boolean = true) {
|
||||||
|
props.data[ScriptDefinitionProperties.refineConfigurationBeforeParsing] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onAnnotations(annotations: Iterable<KotlinType>) {
|
||||||
|
props.data.addToListProperty(ScriptDefinitionProperties.refineConfigurationOnAnnotations, annotations)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onAnnotations(vararg annotations: KotlinType) {
|
||||||
|
onAnnotations(annotations.asIterable())
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified T : Annotation> onAnnotations() {
|
||||||
|
onAnnotations(KotlinType(T::class))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onAnnotations(vararg annotations: KClass<out Annotation>) {
|
||||||
|
onAnnotations(annotations.map { KotlinType(it) })
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onSections(sections: Iterable<String>) {
|
||||||
|
props.data.addToListProperty(ScriptDefinitionProperties.refineConfigurationOnSections, sections)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onSections(vararg sections: String) {
|
||||||
|
props.data.addToListProperty(ScriptDefinitionProperties.refineConfigurationOnSections, *sections)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@ class BridgeDependenciesResolver(
|
|||||||
val processedScriptData =
|
val processedScriptData =
|
||||||
ProcessedScriptData(ProcessedScriptDataProperties.foundAnnotations to scriptContents.annotations)
|
ProcessedScriptData(ProcessedScriptDataProperties.foundAnnotations to scriptContents.annotations)
|
||||||
|
|
||||||
val refineFn = scriptDefinition.getOrNull(ScriptDefinitionProperties.refineConfiguration)
|
val refineFn = scriptDefinition.getOrNull(ScriptDefinitionProperties.refineConfigurationHandler)
|
||||||
val refinedConfiguration =
|
val refinedConfiguration =
|
||||||
if (refineFn == null) calculatedBaseScriptCompilerConfiguration
|
if (refineFn == null) calculatedBaseScriptCompilerConfiguration
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ open class JvmScriptCompiler(
|
|||||||
additionalConfiguration: ScriptCompileConfiguration?
|
additionalConfiguration: ScriptCompileConfiguration?
|
||||||
): ResultWithDiagnostics<CompiledScript<*>> {
|
): ResultWithDiagnostics<CompiledScript<*>> {
|
||||||
val baseConfiguration = chainPropertyBags(additionalConfiguration, scriptDefinition)
|
val baseConfiguration = chainPropertyBags(additionalConfiguration, scriptDefinition)
|
||||||
val refineConfigurationFn = baseConfiguration.getOrNull(ScriptDefinitionProperties.refineConfiguration)
|
val refineConfigurationFn = baseConfiguration.getOrNull(ScriptDefinitionProperties.refineConfigurationHandler)
|
||||||
val refinedConfiguration =
|
val refinedConfiguration =
|
||||||
if (baseConfiguration.getOrNull(ScriptDefinitionProperties.refineBeforeParsing) == true) {
|
if (baseConfiguration.getOrNull(ScriptDefinitionProperties.refineConfigurationBeforeParsing) == true) {
|
||||||
if (refineConfigurationFn == null) {
|
if (refineConfigurationFn == null) {
|
||||||
return ResultWithDiagnostics.Failure("Non-null configurator expected".asErrorDiagnostics())
|
return ResultWithDiagnostics.Failure("Non-null configurator expected".asErrorDiagnostics())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user