Refactoring properties collection after review
This commit is contained in:
+29
-22
@@ -9,45 +9,52 @@ package kotlin.script.experimental.api
|
||||
|
||||
import kotlin.script.experimental.util.PropertiesCollection
|
||||
|
||||
interface ScriptCompileConfiguration : PropertiesCollection {
|
||||
interface ScriptCompileConfigurationKeys
|
||||
|
||||
class ScriptCompileConfiguration(baseConfigurations: Iterable<ScriptCompileConfiguration>, body: Builder.() -> Unit) :
|
||||
PropertiesCollection(Builder(baseConfigurations).apply(body).data) {
|
||||
|
||||
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
|
||||
constructor(
|
||||
vararg baseConfigurations: ScriptCompileConfiguration, body: Builder.() -> Unit = {}
|
||||
) : this(baseConfigurations.asIterable(), body)
|
||||
|
||||
class Builder internal constructor(baseConfigurations: Iterable<ScriptCompileConfiguration>) :
|
||||
ScriptCompileConfigurationKeys,
|
||||
PropertiesCollection.Builder(baseConfigurations)
|
||||
|
||||
companion object : ScriptCompileConfiguration {
|
||||
|
||||
class Builder internal constructor() : PropertiesCollection.Builder(), ScriptCompileConfiguration {
|
||||
override val properties = data
|
||||
}
|
||||
|
||||
fun create(body: Builder.() -> Unit): ScriptCompileConfiguration = Builder().apply(body)
|
||||
}
|
||||
companion object : ScriptCompileConfigurationKeys
|
||||
}
|
||||
|
||||
val ScriptCompileConfiguration.sourceFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
|
||||
val ScriptCompileConfigurationKeys.sourceFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
|
||||
|
||||
val ScriptCompileConfiguration.scriptBodyTarget by PropertiesCollection.keyCopy(ScriptDefinition.scriptBodyTarget)
|
||||
val ScriptCompileConfigurationKeys.scriptBodyTarget by PropertiesCollection.keyCopy(ScriptDefinition.scriptBodyTarget)
|
||||
|
||||
val ScriptCompileConfiguration.scriptImplicitReceivers by PropertiesCollection.keyCopy(ScriptDefinition.scriptImplicitReceivers)
|
||||
val ScriptCompileConfigurationKeys.scriptImplicitReceivers by PropertiesCollection.keyCopy(ScriptDefinition.scriptImplicitReceivers)
|
||||
|
||||
val ScriptCompileConfiguration.contextVariables by PropertiesCollection.keyCopy(ScriptDefinition.contextVariables)
|
||||
val ScriptCompileConfigurationKeys.contextVariables by PropertiesCollection.keyCopy(ScriptDefinition.contextVariables)
|
||||
|
||||
val ScriptCompileConfiguration.defaultImports by PropertiesCollection.keyCopy(ScriptDefinition.defaultImports)
|
||||
val ScriptCompileConfigurationKeys.defaultImports by PropertiesCollection.keyCopy(ScriptDefinition.defaultImports)
|
||||
|
||||
val ScriptCompileConfiguration.restrictions by PropertiesCollection.keyCopy(ScriptDefinition.restrictions)
|
||||
val ScriptCompileConfigurationKeys.restrictions by PropertiesCollection.keyCopy(ScriptDefinition.restrictions)
|
||||
|
||||
val ScriptCompileConfiguration.importedScripts by PropertiesCollection.keyCopy(ScriptDefinition.importedScripts)
|
||||
val ScriptCompileConfigurationKeys.importedScripts by PropertiesCollection.keyCopy(ScriptDefinition.importedScripts)
|
||||
|
||||
val ScriptCompileConfiguration.dependencies by PropertiesCollection.keyCopy(ScriptDefinition.dependencies)
|
||||
val ScriptCompileConfigurationKeys.dependencies by PropertiesCollection.keyCopy(ScriptDefinition.dependencies)
|
||||
|
||||
val ScriptCompileConfiguration.compilerOptions by PropertiesCollection.keyCopy(ScriptDefinition.compilerOptions)
|
||||
val ScriptCompileConfigurationKeys.compilerOptions by PropertiesCollection.keyCopy(ScriptDefinition.compilerOptions)
|
||||
|
||||
|
||||
interface ProcessedScriptData : PropertiesCollection {
|
||||
interface ProcessedScriptDataKeys
|
||||
|
||||
companion object : ProcessedScriptData
|
||||
class ProcessedScriptData(properties: Map<PropertiesCollection.Key<*>, Any>) : PropertiesCollection(properties) {
|
||||
|
||||
companion object : ProcessedScriptDataKeys
|
||||
}
|
||||
|
||||
val ProcessedScriptData.foundAnnotations by PropertiesCollection.key<List<Annotation>>()
|
||||
val ProcessedScriptDataKeys.foundAnnotations by PropertiesCollection.key<List<Annotation>>()
|
||||
|
||||
val ProcessedScriptData.foundFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
|
||||
val ProcessedScriptDataKeys.foundFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
|
||||
|
||||
|
||||
interface RefineScriptCompilationConfigurationHandler {
|
||||
|
||||
@@ -10,57 +10,62 @@ package kotlin.script.experimental.api
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.script.experimental.util.PropertiesCollection
|
||||
|
||||
interface ScriptDefinition : PropertiesCollection {
|
||||
interface ScriptDefinitionKeys
|
||||
|
||||
companion object : ScriptDefinition {
|
||||
open class ScriptDefinition(baseDefinitions: Iterable<ScriptDefinition>, body: Builder.() -> Unit) :
|
||||
PropertiesCollection(Builder(baseDefinitions).apply(body).data) {
|
||||
|
||||
class Builder internal constructor() : PropertiesCollection.Builder(), ScriptDefinition {
|
||||
override val properties = data
|
||||
}
|
||||
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
|
||||
constructor(vararg baseDefinitions: ScriptDefinition, body: Builder.() -> Unit = {}) : this(baseDefinitions.asIterable(), body)
|
||||
|
||||
fun create(body: Builder.() -> Unit): ScriptDefinition = Builder().apply(body)
|
||||
class Builder internal constructor(baseDefinitions: Iterable<ScriptDefinition>) :
|
||||
ScriptDefinitionKeys,
|
||||
PropertiesCollection.Builder(baseDefinitions)
|
||||
|
||||
// inherited from script definition for using as a keys anchor
|
||||
companion object : ScriptDefinitionKeys {
|
||||
|
||||
val Default = ScriptDefinition()
|
||||
}
|
||||
|
||||
object Default : ScriptDefinition
|
||||
}
|
||||
|
||||
val ScriptDefinition.name by PropertiesCollection.key<String>("Kotlin script") // Name of the script type
|
||||
val ScriptDefinitionKeys.name by PropertiesCollection.key<String>("Kotlin script") // Name of the script type
|
||||
|
||||
val ScriptDefinition.fileExtension by PropertiesCollection.key<String>("kts") // file extension
|
||||
val ScriptDefinitionKeys.fileExtension by PropertiesCollection.key<String>("kts") // file extension
|
||||
|
||||
val ScriptDefinition.baseClass by PropertiesCollection.key<KotlinType>() // script base class
|
||||
val ScriptDefinitionKeys.baseClass by PropertiesCollection.key<KotlinType>() // script base class
|
||||
|
||||
val ScriptDefinition.scriptBodyTarget by PropertiesCollection.key<ScriptBodyTarget>(ScriptBodyTarget.Constructor)
|
||||
val ScriptDefinitionKeys.scriptBodyTarget by PropertiesCollection.key<ScriptBodyTarget>(ScriptBodyTarget.Constructor)
|
||||
|
||||
val ScriptDefinition.scriptImplicitReceivers by PropertiesCollection.key<List<KotlinType>>() // in the order from outer to inner scope
|
||||
val ScriptDefinitionKeys.scriptImplicitReceivers by PropertiesCollection.key<List<KotlinType>>() // in the order from outer to inner scope
|
||||
|
||||
val ScriptDefinition.contextVariables by PropertiesCollection.key<Map<String, KotlinType>>() // external variables
|
||||
val ScriptDefinitionKeys.contextVariables by PropertiesCollection.key<Map<String, KotlinType>>() // external variables
|
||||
|
||||
val ScriptDefinition.defaultImports by PropertiesCollection.key<List<String>>()
|
||||
val ScriptDefinitionKeys.defaultImports by PropertiesCollection.key<List<String>>()
|
||||
|
||||
val ScriptDefinition.restrictions by PropertiesCollection.key<List<ResolvingRestrictionRule>>()
|
||||
val ScriptDefinitionKeys.restrictions by PropertiesCollection.key<List<ResolvingRestrictionRule>>()
|
||||
|
||||
val ScriptDefinition.importedScripts by PropertiesCollection.key<List<ScriptSource>>()
|
||||
val ScriptDefinitionKeys.importedScripts by PropertiesCollection.key<List<ScriptSource>>()
|
||||
|
||||
val ScriptDefinition.dependencies by PropertiesCollection.key<List<ScriptDependency>>()
|
||||
val ScriptDefinitionKeys.dependencies by PropertiesCollection.key<List<ScriptDependency>>()
|
||||
|
||||
val ScriptDefinition.generatedClassAnnotations by PropertiesCollection.key<List<Annotation>>()
|
||||
val ScriptDefinitionKeys.generatedClassAnnotations by PropertiesCollection.key<List<Annotation>>()
|
||||
|
||||
val ScriptDefinition.generatedMethodAnnotations by PropertiesCollection.key<List<Annotation>>()
|
||||
val ScriptDefinitionKeys.generatedMethodAnnotations by PropertiesCollection.key<List<Annotation>>()
|
||||
|
||||
val ScriptDefinition.compilerOptions by PropertiesCollection.key<List<String>>() // Q: CommonCompilerOptions instead?
|
||||
val ScriptDefinitionKeys.compilerOptions by PropertiesCollection.key<List<String>>() // Q: CommonCompilerOptions instead?
|
||||
|
||||
val ScriptDefinition.refineConfigurationHandler by PropertiesCollection.key<RefineScriptCompilationConfigurationHandler>() // dynamic configurator
|
||||
val ScriptDefinitionKeys.refineConfigurationHandler by PropertiesCollection.key<RefineScriptCompilationConfigurationHandler>() // dynamic configurator
|
||||
|
||||
val ScriptDefinition.refineConfigurationBeforeParsing by PropertiesCollection.key<Boolean>() // default: false
|
||||
val ScriptDefinitionKeys.refineConfigurationBeforeParsing by PropertiesCollection.key<Boolean>() // default: false
|
||||
|
||||
val ScriptDefinition.refineConfigurationOnAnnotations by PropertiesCollection.key<List<KotlinType>>()
|
||||
val ScriptDefinitionKeys.refineConfigurationOnAnnotations by PropertiesCollection.key<List<KotlinType>>()
|
||||
|
||||
val ScriptDefinition.refineConfigurationOnSections by PropertiesCollection.key<List<String>>()
|
||||
val ScriptDefinitionKeys.refineConfigurationOnSections by PropertiesCollection.key<List<String>>()
|
||||
|
||||
// DSL:
|
||||
|
||||
val ScriptDefinition.refineConfiguration get() = RefineConfigurationBuilder()
|
||||
val ScriptDefinition.Builder.refineConfiguration get() = RefineConfigurationBuilder()
|
||||
|
||||
|
||||
class RefineConfigurationBuilder : PropertiesCollection.Builder() {
|
||||
|
||||
@@ -9,25 +9,30 @@ package kotlin.script.experimental.api
|
||||
|
||||
import kotlin.script.experimental.util.PropertiesCollection
|
||||
|
||||
interface ScriptEvaluationEnvironment : PropertiesCollection {
|
||||
interface ScriptEvaluationEnvironmentKeys
|
||||
|
||||
companion object : ScriptEvaluationEnvironment {
|
||||
class ScriptEvaluationEnvironment(baseEvaluationEnvironments: Iterable<ScriptEvaluationEnvironment>, body: Builder.() -> Unit) :
|
||||
PropertiesCollection(Builder(baseEvaluationEnvironments).apply(body).data) {
|
||||
|
||||
class Builder internal constructor() : PropertiesCollection.Builder(), ScriptEvaluationEnvironment {
|
||||
override val properties = data
|
||||
}
|
||||
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
|
||||
constructor(
|
||||
vararg baseEvaluationEnvironments: ScriptEvaluationEnvironment, body: Builder.() -> Unit = {}
|
||||
) : this(baseEvaluationEnvironments.asIterable(), body)
|
||||
|
||||
fun create(body: Builder.() -> Unit): ScriptEvaluationEnvironment = Builder().apply(body)
|
||||
}
|
||||
class Builder internal constructor(baseEvaluationEnvironments: Iterable<ScriptEvaluationEnvironment>) :
|
||||
ScriptDefinitionKeys,
|
||||
PropertiesCollection.Builder(baseEvaluationEnvironments)
|
||||
|
||||
companion object : ScriptEvaluationEnvironmentKeys
|
||||
}
|
||||
|
||||
val ScriptEvaluationEnvironment.implicitReceivers by PropertiesCollection.key<List<Any>>()
|
||||
val ScriptEvaluationEnvironmentKeys.implicitReceivers by PropertiesCollection.key<List<Any>>()
|
||||
|
||||
val ScriptEvaluationEnvironment.contextVariables by PropertiesCollection.key<Map<String, Any?>>() // external variables
|
||||
val ScriptEvaluationEnvironmentKeys.contextVariables by PropertiesCollection.key<Map<String, Any?>>() // external variables
|
||||
|
||||
val ScriptEvaluationEnvironment.constructorArgs by PropertiesCollection.key<List<Any?>>()
|
||||
val ScriptEvaluationEnvironmentKeys.constructorArgs by PropertiesCollection.key<List<Any?>>()
|
||||
|
||||
val ScriptEvaluationEnvironment.runArgs by PropertiesCollection.key<List<Any?>>()
|
||||
val ScriptEvaluationEnvironmentKeys.runArgs by PropertiesCollection.key<List<Any?>>()
|
||||
|
||||
sealed class ResultValue {
|
||||
class Value(val name: String, val value: Any?, val type: String) : ResultValue() {
|
||||
|
||||
+17
-12
@@ -7,37 +7,42 @@ package kotlin.script.experimental.api
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.script.experimental.util.PropertiesCollection
|
||||
import kotlin.script.experimental.util.getOrNull
|
||||
|
||||
interface ScriptingEnvironment : PropertiesCollection {
|
||||
interface ScriptingEnvironmentKeys
|
||||
|
||||
companion object : ScriptingEnvironment {
|
||||
class ScriptingEnvironment(baseScriptingEnvironments: Iterable<ScriptingEnvironment>, body: Builder.() -> Unit) :
|
||||
PropertiesCollection(Builder(baseScriptingEnvironments).apply(body).data) {
|
||||
|
||||
class Builder internal constructor() : PropertiesCollection.Builder(), ScriptingEnvironment {
|
||||
override val properties = data
|
||||
}
|
||||
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
|
||||
constructor(
|
||||
vararg baseScriptingEnvironments: ScriptingEnvironment, body: Builder.() -> Unit = {}
|
||||
) : this(baseScriptingEnvironments.asIterable(), body)
|
||||
|
||||
fun create(body: Builder.() -> Unit): ScriptingEnvironment = Builder().apply(body)
|
||||
}
|
||||
class Builder internal constructor(baseScriptingEnvironments: Iterable<ScriptingEnvironment>) :
|
||||
ScriptingEnvironmentKeys,
|
||||
PropertiesCollection.Builder(baseScriptingEnvironments)
|
||||
|
||||
companion object : ScriptingEnvironmentKeys
|
||||
}
|
||||
|
||||
// should contain all dependencies needed for baseClass and compilationConfigurator
|
||||
val ScriptingEnvironment.configurationDependencies by PropertiesCollection.key<List<ScriptDependency>>()
|
||||
val ScriptingEnvironmentKeys.configurationDependencies by PropertiesCollection.key<List<ScriptDependency>>()
|
||||
|
||||
// do not use configurationDependencies as script dependencies, so only the dependencies defined by compilationConfigurator will be used
|
||||
// (NOTE: in this case they should include the dependencies for the base class anyway, since this class is needed for script
|
||||
// compilation and instantiation, but compilationConfigurator could be excluded)
|
||||
val ScriptingEnvironment.isolatedDependencies by PropertiesCollection.key<Boolean>(false)
|
||||
val ScriptingEnvironmentKeys.isolatedDependencies by PropertiesCollection.key<Boolean>(false)
|
||||
|
||||
// a "class loader" for KotlinTypes
|
||||
val ScriptingEnvironment.getScriptingClass by PropertiesCollection.key<GetScriptingClass>()
|
||||
val ScriptingEnvironmentKeys.getScriptingClass by PropertiesCollection.key<GetScriptingClass>()
|
||||
|
||||
|
||||
interface GetScriptingClass {
|
||||
operator fun invoke(classType: KotlinType, contextClass: KClass<*>, environment: ScriptingEnvironment): KClass<*>
|
||||
}
|
||||
|
||||
fun ScriptingEnvironment.getScriptingClass(type: KotlinType, contextClass: KClass<*>): KClass<*> {
|
||||
val getClass = getOrNull(ScriptingEnvironment.getScriptingClass)
|
||||
val getClass = get(ScriptingEnvironment.getScriptingClass)
|
||||
?: throw IllegalArgumentException("Expecting 'getScriptingClass' property in the scripting environment: unable to load scripting class $type")
|
||||
return getClass(type, contextClass, this)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user