Refactor definition keys

This commit is contained in:
Ilya Chernikov
2018-08-17 13:15:41 +02:00
parent dbee426647
commit ab63d59a56
11 changed files with 100 additions and 126 deletions
@@ -30,38 +30,43 @@ val ScriptCompileConfigurationKeys.sourceFragments by PropertiesCollection.key<L
val ScriptCompileConfigurationKeys.scriptBodyTarget by PropertiesCollection.keyCopy(ScriptDefinition.scriptBodyTarget)
val ScriptCompileConfigurationKeys.scriptImplicitReceivers by PropertiesCollection.keyCopy(ScriptDefinition.scriptImplicitReceivers)
val ScriptCompileConfigurationKeys.scriptImplicitReceivers by PropertiesCollection.keyCopy(ScriptDefinition.implicitReceivers)
val ScriptCompileConfigurationKeys.contextVariables by PropertiesCollection.keyCopy(ScriptDefinition.contextVariables)
val ScriptCompileConfigurationKeys.providedProperties by PropertiesCollection.keyCopy(ScriptDefinition.providedProperties)
val ScriptCompileConfigurationKeys.defaultImports by PropertiesCollection.keyCopy(ScriptDefinition.defaultImports)
val ScriptCompileConfigurationKeys.restrictions by PropertiesCollection.keyCopy(ScriptDefinition.restrictions)
val ScriptCompileConfigurationKeys.importedScripts by PropertiesCollection.keyCopy(ScriptDefinition.importedScripts)
val ScriptCompileConfigurationKeys.dependencies by PropertiesCollection.keyCopy(ScriptDefinition.dependencies)
val ScriptCompileConfigurationKeys.compilerOptions by PropertiesCollection.keyCopy(ScriptDefinition.compilerOptions)
interface ProcessedScriptDataKeys
interface ScriptCollectedDataKeys
class ProcessedScriptData(properties: Map<PropertiesCollection.Key<*>, Any>) : PropertiesCollection(properties) {
class ScriptCollectedData(properties: Map<PropertiesCollection.Key<*>, Any>) : PropertiesCollection(properties) {
companion object : ProcessedScriptDataKeys
companion object : ScriptCollectedDataKeys
}
val ProcessedScriptDataKeys.foundAnnotations by PropertiesCollection.key<List<Annotation>>()
val ScriptCollectedDataKeys.foundAnnotations by PropertiesCollection.key<List<Annotation>>()
val ProcessedScriptDataKeys.foundFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
val ScriptCollectedDataKeys.foundFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
class ScriptDataFacade(
val source: ScriptSource,
val definition: ScriptDefinition,
val configuration: ScriptCompileConfiguration?,
val collectedData: ScriptCollectedData? = null
)
interface RefineScriptCompilationConfigurationHandler {
suspend operator fun invoke(
scriptSource: ScriptSource,
scriptDefinition: ScriptDefinition,
configuration: ScriptCompileConfiguration?,
processedScriptData: ProcessedScriptData? = null
): ResultWithDiagnostics<ScriptCompileConfiguration?>
}
typealias RefineScriptCompilationConfigurationHandler = (ScriptDataFacade) -> ResultWithDiagnostics<ScriptCompileConfiguration?>
class RefineConfigurationOnAnnotationsData(
val annotations: List<KotlinType>,
val handler: RefineScriptCompilationConfigurationHandler
)
class RefineConfigurationOnSectionsData(
val sections: List<String>,
val handler: RefineScriptCompilationConfigurationHandler
)
@@ -22,7 +22,7 @@ data class ScriptSourceNamedFragment(val name: String?, val range: ScriptSource.
enum class ScriptBodyTarget {
Constructor,
SingleAbstractMethod
SAMFunction
}
data class ResolvingRestrictionRule(
@@ -29,7 +29,7 @@ open class ScriptDefinition(baseDefinitions: Iterable<ScriptDefinition>, body: B
}
}
val ScriptDefinitionKeys.name by PropertiesCollection.key<String>("Kotlin script") // Name of the script type
val ScriptDefinitionKeys.displayName by PropertiesCollection.key<String>("Kotlin script") // Name of the script type
val ScriptDefinitionKeys.fileExtension by PropertiesCollection.key<String>("kts") // file extension
@@ -37,31 +37,25 @@ val ScriptDefinitionKeys.baseClass by PropertiesCollection.key<KotlinType>() //
val ScriptDefinitionKeys.scriptBodyTarget by PropertiesCollection.key<ScriptBodyTarget>(ScriptBodyTarget.Constructor)
val ScriptDefinitionKeys.scriptImplicitReceivers by PropertiesCollection.key<List<KotlinType>>() // in the order from outer to inner scope
val ScriptDefinitionKeys.implicitReceivers by PropertiesCollection.key<List<KotlinType>>() // in the order from outer to inner scope
val ScriptDefinitionKeys.contextVariables by PropertiesCollection.key<Map<String, KotlinType>>() // external variables
val ScriptDefinitionKeys.providedProperties by PropertiesCollection.key<Map<String, KotlinType>>() // external variables
val ScriptDefinitionKeys.defaultImports by PropertiesCollection.key<List<String>>()
val ScriptDefinitionKeys.restrictions by PropertiesCollection.key<List<ResolvingRestrictionRule>>()
val ScriptDefinitionKeys.importedScripts by PropertiesCollection.key<List<ScriptSource>>()
val ScriptDefinitionKeys.dependencies by PropertiesCollection.key<List<ScriptDependency>>()
val ScriptDefinitionKeys.generatedClassAnnotations by PropertiesCollection.key<List<Annotation>>()
val ScriptDefinitionKeys.generatedMethodAnnotations by PropertiesCollection.key<List<Annotation>>()
val ScriptDefinitionKeys.copyAnnotationsFrom by PropertiesCollection.key<List<KotlinType>>()
val ScriptDefinitionKeys.compilerOptions by PropertiesCollection.key<List<String>>() // Q: CommonCompilerOptions instead?
val ScriptDefinitionKeys.refineConfigurationHandler by PropertiesCollection.key<RefineScriptCompilationConfigurationHandler>() // dynamic configurator
val ScriptDefinitionKeys.refineConfigurationBeforeParsing by PropertiesCollection.key<RefineScriptCompilationConfigurationHandler>() // default: false
val ScriptDefinitionKeys.refineConfigurationBeforeParsing by PropertiesCollection.key<Boolean>() // default: false
val ScriptDefinitionKeys.refineConfigurationOnAnnotations by PropertiesCollection.key<RefineConfigurationOnAnnotationsData>()
val ScriptDefinitionKeys.refineConfigurationOnAnnotations by PropertiesCollection.key<List<KotlinType>>()
val ScriptDefinitionKeys.refineConfigurationOnSections by PropertiesCollection.key<List<String>>()
val ScriptDefinitionKeys.refineConfigurationOnSections by PropertiesCollection.key<RefineConfigurationOnSectionsData>()
// DSL:
@@ -70,36 +64,36 @@ val ScriptDefinition.Builder.refineConfiguration get() = RefineConfigurationBuil
class RefineConfigurationBuilder : PropertiesCollection.Builder() {
fun handler(fn: RefineScriptCompilationConfigurationHandler) {
set(ScriptDefinition.refineConfigurationHandler, fn)
fun beforeParsing(handler: RefineScriptCompilationConfigurationHandler) {
set(ScriptDefinition.refineConfigurationBeforeParsing, handler)
}
fun triggerBeforeParsing(value: Boolean = true) {
set(ScriptDefinition.refineConfigurationBeforeParsing, value)
fun onAnnotations(annotations: List<KotlinType>, handler: RefineScriptCompilationConfigurationHandler) {
set(ScriptDefinition.refineConfigurationOnAnnotations, RefineConfigurationOnAnnotationsData(annotations, handler))
}
fun triggerOnAnnotations(annotations: Iterable<KotlinType>) {
ScriptDefinition.refineConfigurationOnAnnotations.append(annotations)
fun onAnnotations(vararg annotations: KotlinType, handler: RefineScriptCompilationConfigurationHandler) {
onAnnotations(annotations.asList(), handler)
}
fun triggerOnAnnotations(vararg annotations: KotlinType) {
triggerOnAnnotations(annotations.asIterable())
inline fun <reified T : Annotation> onAnnotations(noinline handler: RefineScriptCompilationConfigurationHandler) {
onAnnotations(listOf(KotlinType(T::class)), handler)
}
inline fun <reified T : Annotation> triggerOnAnnotations() {
triggerOnAnnotations(KotlinType(T::class))
fun onAnnotations(vararg annotations: KClass<out Annotation>, handler: RefineScriptCompilationConfigurationHandler) {
onAnnotations(annotations.map { KotlinType(it) }, handler)
}
fun triggerOnAnnotations(vararg annotations: KClass<out Annotation>) {
triggerOnAnnotations(annotations.map { KotlinType(it) })
fun onAnnotations(annotations: Iterable<KClass<out Annotation>>, handler: RefineScriptCompilationConfigurationHandler) {
onAnnotations(annotations.map { KotlinType(it) }, handler)
}
fun triggerOnSections(sections: Iterable<String>) {
ScriptDefinition.refineConfigurationOnSections.append(sections)
fun onSections(sections: List<String>, handler: RefineScriptCompilationConfigurationHandler) {
set(ScriptDefinition.refineConfigurationOnSections, RefineConfigurationOnSectionsData(sections, handler))
}
fun triggerOnSections(vararg sections: String) {
ScriptDefinition.refineConfigurationOnSections.append(*sections)
fun onSections(vararg sections: String, handler: RefineScriptCompilationConfigurationHandler) {
onSections(sections.asList(), handler)
}
}
@@ -44,7 +44,7 @@ fun createScriptDefinitionFromAnnotatedBaseClass(
return ScriptDefinition {
baseClass(baseClassType)
fileExtension(baseClass.findAnnotation<KotlinScriptFileExtension>()?.extension ?: mainAnnotation.extension)
name(mainAnnotation.name)
displayName(mainAnnotation.name)
include(scriptingPropsInstance(mainAnnotation.definition))
@@ -163,7 +163,7 @@ open class PropertiesCollection(val properties: Map<Key<*>, Any> = emptyMap()) {
@JvmName("appendToMap")
fun <K, V> PropertiesCollection.Key<in Map<K, V>>.append(values: Iterable<Pair<K, V>>) {
val newValues = get(this)?.let { it + values } ?: values
val newValues = get(this)?.let { it + values } ?: values.toMap()
data[this] = newValues
}