From bb22dadc1e57d29c1c2762d2a8e2adad361f054d Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 21 Aug 2018 12:53:20 +0300 Subject: [PATCH] Rearrange compilation related API --- .../examples/jvm/resolve/maven/scriptDef.kt | 2 +- .../experimental/api/scriptCompilation.kt | 111 ++++++++++++++++++ .../experimental/api/scriptConfiguration.kt | 45 ------- .../script/experimental/api/scriptData.kt | 18 +++ .../experimental/api/scriptDefinition.kt | 100 ---------------- ...tation.kt => configurationFromTemplate.kt} | 0 .../jvmhost/jvmScriptCompilation.kt | 2 +- .../jvm/impl/BridgeDependenciesResolver.kt | 2 +- 8 files changed, 132 insertions(+), 148 deletions(-) delete mode 100644 libraries/scripting/common/src/kotlin/script/experimental/api/scriptConfiguration.kt delete mode 100644 libraries/scripting/common/src/kotlin/script/experimental/api/scriptDefinition.kt rename libraries/scripting/common/src/kotlin/script/experimental/configuration/{definitionFromAnnotation.kt => configurationFromTemplate.kt} (100%) 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 c0e5ef08e78..f2cc057e062 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 @@ -49,7 +49,7 @@ object MyScriptCompilationConfiguration : ScriptCompilationConfiguration( private val resolver = FilesAndMavenResolver() -fun myConfigureOnAnnotations(script: ScriptDataFacade): ResultWithDiagnostics { +fun myConfigureOnAnnotations(script: ScriptConfigurationRefinementContext): ResultWithDiagnostics { val annotations = script.collectedData?.get(ScriptCollectedData.foundAnnotations)?.takeIf { it.isNotEmpty() } ?: return null.asSuccess() val scriptContents = object : ScriptContents { diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt index 4bb9b36b20e..3c2f270a2f4 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt @@ -3,8 +3,119 @@ * that can be found in the license/LICENSE.txt file. */ +@file:Suppress("unused") + package kotlin.script.experimental.api +import kotlin.reflect.KClass +import kotlin.script.experimental.util.PropertiesCollection + +interface ScriptCompilationConfigurationKeys + +open class ScriptCompilationConfiguration(baseConfigurations: Iterable, body: Builder.() -> Unit) : + PropertiesCollection(Builder(baseConfigurations).apply(body).data) { + + constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body) + constructor( + vararg baseConfigurations: ScriptCompilationConfiguration, body: Builder.() -> Unit = {} + ) : this(baseConfigurations.asIterable(), body) + + class Builder internal constructor(baseConfigurations: Iterable) : + ScriptCompilationConfigurationKeys, + PropertiesCollection.Builder(baseConfigurations) + + // inherited from script compilationConfiguration for using as a keys anchor + companion object : ScriptCompilationConfigurationKeys + + object Default : ScriptCompilationConfiguration() +} + +val ScriptCompilationConfigurationKeys.displayName by PropertiesCollection.key("Kotlin script") // Name of the script type + +val ScriptCompilationConfigurationKeys.fileExtension by PropertiesCollection.key("kts") // file extension + +val ScriptCompilationConfigurationKeys.baseClass by PropertiesCollection.key() // script base class + +val ScriptCompilationConfigurationKeys.scriptBodyTarget by PropertiesCollection.key(ScriptBodyTarget.Constructor) + +val ScriptCompilationConfigurationKeys.implicitReceivers by PropertiesCollection.key>() // in the order from outer to inner scope + +val ScriptCompilationConfigurationKeys.providedProperties by PropertiesCollection.key>() // external variables + +val ScriptCompilationConfigurationKeys.defaultImports by PropertiesCollection.key>() + +val ScriptCompilationConfigurationKeys.dependencies by PropertiesCollection.key>() + +val ScriptCompilationConfigurationKeys.copyAnnotationsFrom by PropertiesCollection.key>() + +val ScriptCompilationConfigurationKeys.compilerOptions by PropertiesCollection.key>() // Q: CommonCompilerOptions instead? + +val ScriptCompilationConfigurationKeys.refineConfigurationBeforeParsing by PropertiesCollection.key() + +val ScriptCompilationConfigurationKeys.refineConfigurationOnAnnotations by PropertiesCollection.key() + +val ScriptCompilationConfigurationKeys.refineConfigurationOnSections by PropertiesCollection.key() + +val ScriptCompilationConfigurationKeys.sourceFragments by PropertiesCollection.key>() + +// DSL: + +val ScriptCompilationConfiguration.Builder.refineConfiguration get() = RefineConfigurationBuilder() + + +class RefineConfigurationBuilder : PropertiesCollection.Builder() { + + fun beforeParsing(handler: RefineScriptCompilationConfigurationHandler) { + set(ScriptCompilationConfiguration.refineConfigurationBeforeParsing, RefineConfigurationBeforeParsingData(handler)) + } + + fun onAnnotations(annotations: List, handler: RefineScriptCompilationConfigurationHandler) { + set(ScriptCompilationConfiguration.refineConfigurationOnAnnotations, RefineConfigurationOnAnnotationsData(annotations, handler)) + } + + fun onAnnotations(vararg annotations: KotlinType, handler: RefineScriptCompilationConfigurationHandler) { + onAnnotations(annotations.asList(), handler) + } + + inline fun onAnnotations(noinline handler: RefineScriptCompilationConfigurationHandler) { + onAnnotations(listOf(KotlinType(T::class)), handler) + } + + fun onAnnotations(vararg annotations: KClass, handler: RefineScriptCompilationConfigurationHandler) { + onAnnotations(annotations.map { KotlinType(it) }, handler) + } + + fun onAnnotations(annotations: Iterable>, handler: RefineScriptCompilationConfigurationHandler) { + onAnnotations(annotations.map { KotlinType(it) }, handler) + } + + fun onSections(sections: List, handler: RefineScriptCompilationConfigurationHandler) { + set(ScriptCompilationConfiguration.refineConfigurationOnSections, RefineConfigurationOnSectionsData(sections, handler)) + } + + fun onSections(vararg sections: String, handler: RefineScriptCompilationConfigurationHandler) { + onSections(sections.asList(), handler) + } +} + +typealias RefineScriptCompilationConfigurationHandler = (ScriptConfigurationRefinementContext) -> ResultWithDiagnostics + +// to make it "hasheable" for cashing +class RefineConfigurationBeforeParsingData( + val handler: RefineScriptCompilationConfigurationHandler +) + +class RefineConfigurationOnAnnotationsData( + val annotations: List, + val handler: RefineScriptCompilationConfigurationHandler +) + +class RefineConfigurationOnSectionsData( + val sections: List, + val handler: RefineScriptCompilationConfigurationHandler +) + + interface ScriptCompiler { suspend operator fun invoke( diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptConfiguration.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptConfiguration.kt deleted file mode 100644 index 7010a1d84df..00000000000 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptConfiguration.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -@file:Suppress("unused") - -package kotlin.script.experimental.api - -import kotlin.script.experimental.util.PropertiesCollection - - -interface ScriptCollectedDataKeys - -class ScriptCollectedData(properties: Map, Any>) : PropertiesCollection(properties) { - - companion object : ScriptCollectedDataKeys -} - -val ScriptCollectedDataKeys.foundAnnotations by PropertiesCollection.key>() - -val ScriptCollectedDataKeys.foundFragments by PropertiesCollection.key>() - -class ScriptDataFacade( - val source: ScriptSource, - val compilationConfiguration: ScriptCompilationConfiguration, - val collectedData: ScriptCollectedData? = null -) - -typealias RefineScriptCompilationConfigurationHandler = (ScriptDataFacade) -> ResultWithDiagnostics - -// to make it "hasheable" for cashing -class RefineConfigurationBeforeParsingData( - val handler: RefineScriptCompilationConfigurationHandler -) - -class RefineConfigurationOnAnnotationsData( - val annotations: List, - val handler: RefineScriptCompilationConfigurationHandler -) - -class RefineConfigurationOnSectionsData( - val sections: List, - val handler: RefineScriptCompilationConfigurationHandler -) diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptData.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptData.kt index b2cfc480716..d1bc185b40d 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptData.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptData.kt @@ -8,6 +8,7 @@ package kotlin.script.experimental.api import java.net.URL +import kotlin.script.experimental.util.PropertiesCollection interface ScriptSource { val location: URL? @@ -39,3 +40,20 @@ interface ScriptDependency { // Q: anything generic here? } + +interface ScriptCollectedDataKeys + +class ScriptCollectedData(properties: Map, Any>) : PropertiesCollection(properties) { + + companion object : ScriptCollectedDataKeys +} + +val ScriptCollectedDataKeys.foundAnnotations by PropertiesCollection.key>() + +val ScriptCollectedDataKeys.foundFragments by PropertiesCollection.key>() + +class ScriptConfigurationRefinementContext( + val source: ScriptSource, + val compilationConfiguration: ScriptCompilationConfiguration, + val collectedData: ScriptCollectedData? = null +) diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptDefinition.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptDefinition.kt deleted file mode 100644 index 92cb8f84fd4..00000000000 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptDefinition.kt +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -@file:Suppress("unused") - -package kotlin.script.experimental.api - -import kotlin.reflect.KClass -import kotlin.script.experimental.util.PropertiesCollection - -interface ScriptCompilationConfigurationKeys - -open class ScriptCompilationConfiguration(baseConfigurations: Iterable, body: Builder.() -> Unit) : - PropertiesCollection(Builder(baseConfigurations).apply(body).data) { - - constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body) - constructor( - vararg baseConfigurations: ScriptCompilationConfiguration, body: Builder.() -> Unit = {} - ) : this(baseConfigurations.asIterable(), body) - - class Builder internal constructor(baseConfigurations: Iterable) : - ScriptCompilationConfigurationKeys, - PropertiesCollection.Builder(baseConfigurations) - - // inherited from script compilationConfiguration for using as a keys anchor - companion object : ScriptCompilationConfigurationKeys - - object Default : ScriptCompilationConfiguration() -} - -val ScriptCompilationConfigurationKeys.displayName by PropertiesCollection.key("Kotlin script") // Name of the script type - -val ScriptCompilationConfigurationKeys.fileExtension by PropertiesCollection.key("kts") // file extension - -val ScriptCompilationConfigurationKeys.baseClass by PropertiesCollection.key() // script base class - -val ScriptCompilationConfigurationKeys.scriptBodyTarget by PropertiesCollection.key(ScriptBodyTarget.Constructor) - -val ScriptCompilationConfigurationKeys.implicitReceivers by PropertiesCollection.key>() // in the order from outer to inner scope - -val ScriptCompilationConfigurationKeys.providedProperties by PropertiesCollection.key>() // external variables - -val ScriptCompilationConfigurationKeys.defaultImports by PropertiesCollection.key>() - -val ScriptCompilationConfigurationKeys.dependencies by PropertiesCollection.key>() - -val ScriptCompilationConfigurationKeys.copyAnnotationsFrom by PropertiesCollection.key>() - -val ScriptCompilationConfigurationKeys.compilerOptions by PropertiesCollection.key>() // Q: CommonCompilerOptions instead? - -val ScriptCompilationConfigurationKeys.refineConfigurationBeforeParsing by PropertiesCollection.key() - -val ScriptCompilationConfigurationKeys.refineConfigurationOnAnnotations by PropertiesCollection.key() - -val ScriptCompilationConfigurationKeys.refineConfigurationOnSections by PropertiesCollection.key() - -val ScriptCompilationConfigurationKeys.sourceFragments by PropertiesCollection.key>() - -// DSL: - -val ScriptCompilationConfiguration.Builder.refineConfiguration get() = RefineConfigurationBuilder() - - -class RefineConfigurationBuilder : PropertiesCollection.Builder() { - - fun beforeParsing(handler: RefineScriptCompilationConfigurationHandler) { - set(ScriptCompilationConfiguration.refineConfigurationBeforeParsing, RefineConfigurationBeforeParsingData(handler)) - } - - fun onAnnotations(annotations: List, handler: RefineScriptCompilationConfigurationHandler) { - set(ScriptCompilationConfiguration.refineConfigurationOnAnnotations, RefineConfigurationOnAnnotationsData(annotations, handler)) - } - - fun onAnnotations(vararg annotations: KotlinType, handler: RefineScriptCompilationConfigurationHandler) { - onAnnotations(annotations.asList(), handler) - } - - inline fun onAnnotations(noinline handler: RefineScriptCompilationConfigurationHandler) { - onAnnotations(listOf(KotlinType(T::class)), handler) - } - - fun onAnnotations(vararg annotations: KClass, handler: RefineScriptCompilationConfigurationHandler) { - onAnnotations(annotations.map { KotlinType(it) }, handler) - } - - fun onAnnotations(annotations: Iterable>, handler: RefineScriptCompilationConfigurationHandler) { - onAnnotations(annotations.map { KotlinType(it) }, handler) - } - - fun onSections(sections: List, handler: RefineScriptCompilationConfigurationHandler) { - set(ScriptCompilationConfiguration.refineConfigurationOnSections, RefineConfigurationOnSectionsData(sections, handler)) - } - - fun onSections(vararg sections: String, handler: RefineScriptCompilationConfigurationHandler) { - onSections(sections.asList(), handler) - } -} - diff --git a/libraries/scripting/common/src/kotlin/script/experimental/configuration/definitionFromAnnotation.kt b/libraries/scripting/common/src/kotlin/script/experimental/configuration/configurationFromTemplate.kt similarity index 100% rename from libraries/scripting/common/src/kotlin/script/experimental/configuration/definitionFromAnnotation.kt rename to libraries/scripting/common/src/kotlin/script/experimental/configuration/configurationFromTemplate.kt diff --git a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptCompilation.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptCompilation.kt index 51197ce15bf..c79fa24544f 100644 --- a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptCompilation.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptCompilation.kt @@ -40,7 +40,7 @@ open class JvmScriptCompiler( ): ResultWithDiagnostics> { val refineConfigurationFn = scriptCompilationConfiguration[ScriptCompilationConfiguration.refineConfigurationBeforeParsing] val refinedConfiguration = - refineConfigurationFn?.handler?.invoke(ScriptDataFacade(script, scriptCompilationConfiguration))?.let { + refineConfigurationFn?.handler?.invoke(ScriptConfigurationRefinementContext(script, scriptCompilationConfiguration))?.let { when (it) { is ResultWithDiagnostics.Failure -> return it is ResultWithDiagnostics.Success -> it.value diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/BridgeDependenciesResolver.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/BridgeDependenciesResolver.kt index f43cbed6510..62aba7f394b 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/BridgeDependenciesResolver.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/BridgeDependenciesResolver.kt @@ -44,7 +44,7 @@ class BridgeDependenciesResolver( if (refineFn == null) null else { val res = refineFn( - ScriptDataFacade(scriptContents.toScriptSource(), scriptCompilationConfiguration, processedScriptData) + ScriptConfigurationRefinementContext(scriptContents.toScriptSource(), scriptCompilationConfiguration, processedScriptData) ) when (res) { is ResultWithDiagnostics.Failure ->