Implement composable refinement handlers...
for compilation and evaluation configurations. Add utilities to apply refinements uniformly. Also fix one invoke for list values - it was not consistent with other builders
This commit is contained in:
@@ -130,17 +130,17 @@ val ScriptCompilationConfigurationKeys.compilerOptions by PropertiesCollection.k
|
|||||||
/**
|
/**
|
||||||
* The callback that will be called on the script compilation before parsing the script
|
* The callback that will be called on the script compilation before parsing the script
|
||||||
*/
|
*/
|
||||||
val ScriptCompilationConfigurationKeys.refineConfigurationBeforeParsing by PropertiesCollection.key<RefineConfigurationUnconditionallyData>()
|
val ScriptCompilationConfigurationKeys.refineConfigurationBeforeParsing by PropertiesCollection.key<List<RefineConfigurationUnconditionallyData>>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The callback that will be called on the script compilation after parsing script file annotations
|
* The callback that will be called on the script compilation after parsing script file annotations
|
||||||
*/
|
*/
|
||||||
val ScriptCompilationConfigurationKeys.refineConfigurationOnAnnotations by PropertiesCollection.key<RefineConfigurationOnAnnotationsData>()
|
val ScriptCompilationConfigurationKeys.refineConfigurationOnAnnotations by PropertiesCollection.key<List<RefineConfigurationOnAnnotationsData>>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The callback that will be called on the script compilation immediately before starting the compilation
|
* The callback that will be called on the script compilation immediately before starting the compilation
|
||||||
*/
|
*/
|
||||||
val ScriptCompilationConfigurationKeys.refineConfigurationBeforeCompiling by PropertiesCollection.key<RefineConfigurationUnconditionallyData>()
|
val ScriptCompilationConfigurationKeys.refineConfigurationBeforeCompiling by PropertiesCollection.key<List<RefineConfigurationUnconditionallyData>>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The list of script fragments that should be compiled intead of the whole text
|
* The list of script fragments that should be compiled intead of the whole text
|
||||||
@@ -166,7 +166,7 @@ class RefineConfigurationBuilder : PropertiesCollection.Builder() {
|
|||||||
* @param handler the callback that will be called
|
* @param handler the callback that will be called
|
||||||
*/
|
*/
|
||||||
fun beforeParsing(handler: RefineScriptCompilationConfigurationHandler) {
|
fun beforeParsing(handler: RefineScriptCompilationConfigurationHandler) {
|
||||||
set(ScriptCompilationConfiguration.refineConfigurationBeforeParsing, RefineConfigurationUnconditionallyData(handler))
|
ScriptCompilationConfiguration.refineConfigurationBeforeParsing.append(RefineConfigurationUnconditionallyData(handler))
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -176,7 +176,7 @@ class RefineConfigurationBuilder : PropertiesCollection.Builder() {
|
|||||||
*/
|
*/
|
||||||
fun onAnnotations(annotations: List<KotlinType>, handler: RefineScriptCompilationConfigurationHandler) {
|
fun onAnnotations(annotations: List<KotlinType>, handler: RefineScriptCompilationConfigurationHandler) {
|
||||||
// TODO: implement handlers composition
|
// TODO: implement handlers composition
|
||||||
set(ScriptCompilationConfiguration.refineConfigurationOnAnnotations, RefineConfigurationOnAnnotationsData(annotations, handler))
|
ScriptCompilationConfiguration.refineConfigurationOnAnnotations.append(RefineConfigurationOnAnnotationsData(annotations, handler))
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -220,7 +220,7 @@ class RefineConfigurationBuilder : PropertiesCollection.Builder() {
|
|||||||
* @param handler the callback that will be called
|
* @param handler the callback that will be called
|
||||||
*/
|
*/
|
||||||
fun beforeCompiling(handler: RefineScriptCompilationConfigurationHandler) {
|
fun beforeCompiling(handler: RefineScriptCompilationConfigurationHandler) {
|
||||||
set(ScriptCompilationConfiguration.refineConfigurationBeforeCompiling, RefineConfigurationUnconditionallyData(handler))
|
ScriptCompilationConfiguration.refineConfigurationBeforeCompiling.append(RefineConfigurationUnconditionallyData(handler))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,20 +230,72 @@ class RefineConfigurationBuilder : PropertiesCollection.Builder() {
|
|||||||
typealias RefineScriptCompilationConfigurationHandler =
|
typealias RefineScriptCompilationConfigurationHandler =
|
||||||
(ScriptConfigurationRefinementContext) -> ResultWithDiagnostics<ScriptCompilationConfiguration>
|
(ScriptConfigurationRefinementContext) -> ResultWithDiagnostics<ScriptCompilationConfiguration>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The refinement callback function signature for simple handlers (without diagnostics or errors)
|
||||||
|
*/
|
||||||
|
typealias SimpleRefineScriptCompilationConfigurationHandler =
|
||||||
|
(ScriptConfigurationRefinementContext) -> ScriptCompilationConfiguration
|
||||||
|
|
||||||
data class RefineConfigurationUnconditionallyData(
|
data class RefineConfigurationUnconditionallyData(
|
||||||
val handler: RefineScriptCompilationConfigurationHandler
|
val handler: RefineScriptCompilationConfigurationHandler
|
||||||
) : Serializable {
|
) : Serializable {
|
||||||
companion object { private const val serialVersionUID: Long = 1L }
|
companion object {
|
||||||
|
private const val serialVersionUID: Long = 1L
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data class RefineConfigurationOnAnnotationsData(
|
data class RefineConfigurationOnAnnotationsData(
|
||||||
val annotations: List<KotlinType>,
|
val annotations: List<KotlinType>,
|
||||||
val handler: RefineScriptCompilationConfigurationHandler
|
val handler: RefineScriptCompilationConfigurationHandler
|
||||||
) : Serializable {
|
) : Serializable {
|
||||||
companion object { private const val serialVersionUID: Long = 1L }
|
companion object {
|
||||||
|
private const val serialVersionUID: Long = 1L
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun ScriptCompilationConfiguration.refineBeforeParsing(
|
||||||
|
script: SourceCode,
|
||||||
|
collectedData: ScriptCollectedData? = null
|
||||||
|
): ResultWithDiagnostics<ScriptCompilationConfiguration> =
|
||||||
|
simpleRefineImpl(ScriptCompilationConfiguration.refineConfigurationBeforeParsing) { config, refineData ->
|
||||||
|
refineData.handler.invoke(ScriptConfigurationRefinementContext(script, config, collectedData))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun ScriptCompilationConfiguration.refineOnAnnotations(
|
||||||
|
script: SourceCode,
|
||||||
|
collectedData: ScriptCollectedData
|
||||||
|
): ResultWithDiagnostics<ScriptCompilationConfiguration> {
|
||||||
|
val foundAnnotationNames = collectedData[ScriptCollectedData.foundAnnotations]?.mapTo(HashSet()) { it.annotationClass.java.name }
|
||||||
|
if (foundAnnotationNames.isNullOrEmpty()) return this.asSuccess()
|
||||||
|
|
||||||
|
val refinedConfig = this[ScriptCompilationConfiguration.refineConfigurationOnAnnotations]
|
||||||
|
?.fold(this) { config, (annotations, handler) ->
|
||||||
|
// checking that the collected data contains expected annotations
|
||||||
|
if (annotations.none { foundAnnotationNames.contains(it.typeName) }) config
|
||||||
|
else handler.invoke(ScriptConfigurationRefinementContext(script, config, collectedData)).valueOr { return it }
|
||||||
|
}
|
||||||
|
return (refinedConfig ?: this).asSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun ScriptCompilationConfiguration.refineBeforeCompiling(
|
||||||
|
script: SourceCode,
|
||||||
|
collectedData: ScriptCollectedData? = null
|
||||||
|
): ResultWithDiagnostics<ScriptCompilationConfiguration> =
|
||||||
|
simpleRefineImpl(ScriptCompilationConfiguration.refineConfigurationBeforeCompiling) { config, refineData ->
|
||||||
|
refineData.handler.invoke(ScriptConfigurationRefinementContext(script, config, collectedData))
|
||||||
|
}
|
||||||
|
|
||||||
|
internal inline fun <Configuration: PropertiesCollection, RefineData> Configuration.simpleRefineImpl(
|
||||||
|
key: PropertiesCollection.Key<List<RefineData>>,
|
||||||
|
refineFn: (Configuration, RefineData) -> ResultWithDiagnostics<Configuration>
|
||||||
|
): ResultWithDiagnostics<Configuration> = (
|
||||||
|
this[key]
|
||||||
|
?.fold(this) { config, refineData ->
|
||||||
|
refineFn(config, refineData).valueOr { return it }
|
||||||
|
} ?: this
|
||||||
|
).asSuccess()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The functional interface to the script compiler
|
* The functional interface to the script compiler
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ val ScriptCollectedDataKeys.foundAnnotations by PropertiesCollection.key<List<An
|
|||||||
/**
|
/**
|
||||||
* The facade to the script data for compilation configuration refinement callbacks
|
* The facade to the script data for compilation configuration refinement callbacks
|
||||||
*/
|
*/
|
||||||
class ScriptConfigurationRefinementContext(
|
data class ScriptConfigurationRefinementContext(
|
||||||
val script: SourceCode,
|
val script: SourceCode,
|
||||||
val compilationConfiguration: ScriptCompilationConfiguration,
|
val compilationConfiguration: ScriptCompilationConfiguration,
|
||||||
val collectedData: ScriptCollectedData? = null
|
val collectedData: ScriptCollectedData? = null
|
||||||
@@ -114,7 +114,7 @@ class ScriptEvaluationContextData(properties: Map<PropertiesCollection.Key<*>, A
|
|||||||
/**
|
/**
|
||||||
* The facade to the script data for evaluation configuration refinement callbacks
|
* The facade to the script data for evaluation configuration refinement callbacks
|
||||||
*/
|
*/
|
||||||
class ScriptEvaluationConfigurationRefinementContext(
|
data class ScriptEvaluationConfigurationRefinementContext(
|
||||||
val compiledScript: CompiledScript<*>,
|
val compiledScript: CompiledScript<*>,
|
||||||
val evaluationConfiguration: ScriptEvaluationConfiguration,
|
val evaluationConfiguration: ScriptEvaluationConfiguration,
|
||||||
val contextData: ScriptEvaluationContextData? = null
|
val contextData: ScriptEvaluationContextData? = null
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ val ScriptEvaluationConfigurationKeys.hostConfiguration by PropertiesCollection.
|
|||||||
/**
|
/**
|
||||||
* The callback that will be called on the script compilation immediately before starting the compilation
|
* The callback that will be called on the script compilation immediately before starting the compilation
|
||||||
*/
|
*/
|
||||||
val ScriptEvaluationConfigurationKeys.refineConfigurationBeforeEvaluate by PropertiesCollection.key<RefineEvaluationConfigurationData>()
|
val ScriptEvaluationConfigurationKeys.refineConfigurationBeforeEvaluate by PropertiesCollection.key<List<RefineEvaluationConfigurationData>>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A helper to enable scriptsInstancesSharingMap with default implementation
|
* A helper to enable scriptsInstancesSharingMap with default implementation
|
||||||
@@ -103,7 +103,7 @@ fun ScriptEvaluationConfiguration.Builder.enableScriptsInstancesSharing() {
|
|||||||
* A helper to enable passing lambda directly to the refinement "keyword"
|
* A helper to enable passing lambda directly to the refinement "keyword"
|
||||||
*/
|
*/
|
||||||
fun ScriptEvaluationConfiguration.Builder.refineConfigurationBeforeEvaluate(handler: RefineScriptEvaluationConfigurationHandler) {
|
fun ScriptEvaluationConfiguration.Builder.refineConfigurationBeforeEvaluate(handler: RefineScriptEvaluationConfigurationHandler) {
|
||||||
set(ScriptEvaluationConfiguration.refineConfigurationBeforeEvaluate, RefineEvaluationConfigurationData(handler))
|
ScriptEvaluationConfiguration.refineConfigurationBeforeEvaluate.append(RefineEvaluationConfigurationData(handler))
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -118,6 +118,14 @@ data class RefineEvaluationConfigurationData(
|
|||||||
companion object { private const val serialVersionUID: Long = 1L }
|
companion object { private const val serialVersionUID: Long = 1L }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun ScriptEvaluationConfiguration.refineBeforeEvaluation(
|
||||||
|
script: CompiledScript<*>,
|
||||||
|
contextData: ScriptEvaluationContextData? = null
|
||||||
|
): ResultWithDiagnostics<ScriptEvaluationConfiguration> =
|
||||||
|
simpleRefineImpl(ScriptEvaluationConfiguration.refineConfigurationBeforeEvaluate) { config, refineData ->
|
||||||
|
refineData.handler.invoke(ScriptEvaluationConfigurationRefinementContext(script, config, contextData))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The script evaluation result value
|
* The script evaluation result value
|
||||||
*/
|
*/
|
||||||
|
|||||||
+1
-1
@@ -111,7 +111,7 @@ open class PropertiesCollection(private val properties: Map<Key<*>, Any?> = empt
|
|||||||
// generic for lists
|
// generic for lists
|
||||||
|
|
||||||
operator fun <T> PropertiesCollection.Key<in List<T>>.invoke(vararg vals: T) {
|
operator fun <T> PropertiesCollection.Key<in List<T>>.invoke(vararg vals: T) {
|
||||||
data[this] = vals.toList()
|
append(vals.asIterable())
|
||||||
}
|
}
|
||||||
|
|
||||||
// generic for maps:
|
// generic for maps:
|
||||||
|
|||||||
+134
@@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kotlin.script.experimental.jvmhost.test
|
||||||
|
|
||||||
|
import junit.framework.TestCase
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import org.junit.Assert
|
||||||
|
import org.junit.Test
|
||||||
|
import kotlin.script.experimental.api.*
|
||||||
|
import kotlin.script.experimental.host.toScriptSource
|
||||||
|
import kotlin.script.experimental.jvm.BasicJvmScriptEvaluator
|
||||||
|
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
|
||||||
|
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
|
||||||
|
import kotlin.script.experimental.jvm.jvm
|
||||||
|
import kotlin.script.experimental.jvmhost.JvmScriptCompiler
|
||||||
|
import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate
|
||||||
|
import kotlin.script.experimental.jvmhost.createJvmEvaluationConfigurationFromTemplate
|
||||||
|
|
||||||
|
class ConfigurationDslTest : TestCase() {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testComposableRefinementHandlers() {
|
||||||
|
val baseConfig = createJvmCompilationConfigurationFromTemplate<SimpleScript> {
|
||||||
|
jvm {
|
||||||
|
dependenciesFromCurrentContext(wholeClasspath = true)
|
||||||
|
}
|
||||||
|
defaultImports(MyTestAnnotation1::class, MyTestAnnotation2::class)
|
||||||
|
refineConfiguration {
|
||||||
|
beforeParsing { (_, config, _) ->
|
||||||
|
config.with {
|
||||||
|
implicitReceivers(Int::class)
|
||||||
|
}.asSuccess()
|
||||||
|
}
|
||||||
|
onAnnotations<MyTestAnnotation1> { (_, config, _) ->
|
||||||
|
config.with {
|
||||||
|
providedProperties("ann1" to String::class)
|
||||||
|
}.asSuccess()
|
||||||
|
}
|
||||||
|
onAnnotations(MyTestAnnotation1::class, MyTestAnnotation2::class) { (_, config, _) ->
|
||||||
|
config.with {
|
||||||
|
providedProperties("ann12" to Int::class)
|
||||||
|
}.asSuccess()
|
||||||
|
}
|
||||||
|
onAnnotations<MyTestAnnotation2> { (_, config, _) ->
|
||||||
|
config.with {
|
||||||
|
providedProperties("ann2" to String::class)
|
||||||
|
}.asSuccess()
|
||||||
|
}
|
||||||
|
beforeCompiling { (_, config, _) ->
|
||||||
|
config.with {
|
||||||
|
compilerOptions("-version")
|
||||||
|
}.asSuccess()
|
||||||
|
}
|
||||||
|
beforeCompiling { (_, config, _) ->
|
||||||
|
config.with {
|
||||||
|
implicitReceivers(Float::class)
|
||||||
|
}.asSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.assertNull(baseConfig[ScriptCompilationConfiguration.implicitReceivers])
|
||||||
|
Assert.assertNull(baseConfig[ScriptCompilationConfiguration.providedProperties])
|
||||||
|
Assert.assertNull(baseConfig[ScriptCompilationConfiguration.compilerOptions])
|
||||||
|
|
||||||
|
val script = "@file:MyTestAnnotation1\nann1+ann12".toScriptSource()
|
||||||
|
|
||||||
|
val compiledScript = runBlocking {
|
||||||
|
JvmScriptCompiler(defaultJvmScriptingHostConfiguration).invoke(script, baseConfig).valueOrThrow()
|
||||||
|
}
|
||||||
|
val finalConfig = compiledScript.compilationConfiguration
|
||||||
|
|
||||||
|
Assert.assertEquals(
|
||||||
|
listOf(KotlinType(Int::class), KotlinType(Float::class)),
|
||||||
|
finalConfig[ScriptCompilationConfiguration.implicitReceivers]
|
||||||
|
)
|
||||||
|
Assert.assertEquals(
|
||||||
|
mapOf("ann1" to KotlinType(String::class), "ann12" to KotlinType(Int::class)),
|
||||||
|
finalConfig[ScriptCompilationConfiguration.providedProperties]
|
||||||
|
)
|
||||||
|
Assert.assertEquals(
|
||||||
|
listOf("-version"),
|
||||||
|
finalConfig[ScriptCompilationConfiguration.compilerOptions]
|
||||||
|
)
|
||||||
|
|
||||||
|
val implicitReceiver1 = 10
|
||||||
|
val implicitReceiver2 = 2.0f
|
||||||
|
val propAnn1 = "a1"
|
||||||
|
val propAnn12 = 12
|
||||||
|
|
||||||
|
val baseEvalConfig = createJvmEvaluationConfigurationFromTemplate<SimpleScript> {
|
||||||
|
refineConfigurationBeforeEvaluate { (_, config, _) ->
|
||||||
|
config.with {
|
||||||
|
implicitReceivers(implicitReceiver1)
|
||||||
|
providedProperties("ann1" to propAnn1)
|
||||||
|
}.asSuccess()
|
||||||
|
}
|
||||||
|
refineConfigurationBeforeEvaluate { (_, config, _) ->
|
||||||
|
config.with {
|
||||||
|
implicitReceivers(implicitReceiver2)
|
||||||
|
providedProperties("ann12" to propAnn12)
|
||||||
|
}.asSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.assertNull(baseEvalConfig[ScriptCompilationConfiguration.implicitReceivers])
|
||||||
|
Assert.assertNull(baseEvalConfig[ScriptCompilationConfiguration.providedProperties])
|
||||||
|
|
||||||
|
val evalRes = runBlocking {
|
||||||
|
BasicJvmScriptEvaluator().invoke(compiledScript, baseEvalConfig).valueOrThrow()
|
||||||
|
}
|
||||||
|
val finalEvalConfig = evalRes.configuration!!
|
||||||
|
|
||||||
|
Assert.assertEquals(
|
||||||
|
listOf<Any>(implicitReceiver1, implicitReceiver2),
|
||||||
|
finalEvalConfig[ScriptEvaluationConfiguration.implicitReceivers]
|
||||||
|
)
|
||||||
|
Assert.assertEquals(
|
||||||
|
mapOf("ann1" to propAnn1, "ann12" to propAnn12),
|
||||||
|
finalEvalConfig[ScriptEvaluationConfiguration.providedProperties]
|
||||||
|
)
|
||||||
|
|
||||||
|
Assert.assertEquals(propAnn1 + propAnn12, (evalRes.returnValue as ResultValue.Value).value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Target(AnnotationTarget.FILE)
|
||||||
|
annotation class MyTestAnnotation1
|
||||||
|
|
||||||
|
@Target(AnnotationTarget.FILE)
|
||||||
|
annotation class MyTestAnnotation2
|
||||||
+9
-16
@@ -39,24 +39,17 @@ open class JvmScriptCompiler(
|
|||||||
override suspend operator fun invoke(
|
override suspend operator fun invoke(
|
||||||
script: SourceCode,
|
script: SourceCode,
|
||||||
scriptCompilationConfiguration: ScriptCompilationConfiguration
|
scriptCompilationConfiguration: ScriptCompilationConfiguration
|
||||||
): ResultWithDiagnostics<CompiledScript<*>> {
|
): ResultWithDiagnostics<CompiledScript<*>> =
|
||||||
val refineConfigurationFn = scriptCompilationConfiguration[ScriptCompilationConfiguration.refineConfigurationBeforeParsing]
|
scriptCompilationConfiguration.refineBeforeParsing(script).onSuccess { refinedConfiguration ->
|
||||||
val refinedConfiguration =
|
val cached = cache.get(script, refinedConfiguration)
|
||||||
refineConfigurationFn?.handler?.invoke(ScriptConfigurationRefinementContext(script, scriptCompilationConfiguration))?.let {
|
|
||||||
when (it) {
|
if (cached != null) return cached.asSuccess()
|
||||||
is ResultWithDiagnostics.Failure -> return it
|
|
||||||
is ResultWithDiagnostics.Success -> it.value
|
compilerProxy.compile(script, refinedConfiguration).also {
|
||||||
|
if (it is ResultWithDiagnostics.Success) {
|
||||||
|
cache.store(it.value, script, refinedConfiguration)
|
||||||
}
|
}
|
||||||
} ?: scriptCompilationConfiguration
|
|
||||||
val cached = cache.get(script, refinedConfiguration)
|
|
||||||
|
|
||||||
if (cached != null) return cached.asSuccess()
|
|
||||||
|
|
||||||
return compilerProxy.compile(script, refinedConfiguration).also {
|
|
||||||
if (it is ResultWithDiagnostics.Success) {
|
|
||||||
cache.store(it.value, script, refinedConfiguration)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-12
@@ -31,18 +31,9 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator {
|
|||||||
}.onSuccess { importedScriptsEvalResults ->
|
}.onSuccess { importedScriptsEvalResults ->
|
||||||
|
|
||||||
val refinedEvalConfiguration =
|
val refinedEvalConfiguration =
|
||||||
configuration[ScriptEvaluationConfiguration.refineConfigurationBeforeEvaluate]
|
configuration.refineBeforeEvaluation(compiledScript).valueOr {
|
||||||
?.handler?.invoke(
|
return@invoke ResultWithDiagnostics.Failure(it.reports)
|
||||||
ScriptEvaluationConfigurationRefinementContext(
|
}
|
||||||
compiledScript,
|
|
||||||
configuration
|
|
||||||
)
|
|
||||||
)
|
|
||||||
?.onFailure {
|
|
||||||
return@invoke ResultWithDiagnostics.Failure(it.reports)
|
|
||||||
}
|
|
||||||
?.valueOrNull()
|
|
||||||
?: configuration
|
|
||||||
|
|
||||||
val resultValue = try {
|
val resultValue = try {
|
||||||
val instance =
|
val instance =
|
||||||
|
|||||||
+4
-9
@@ -43,15 +43,10 @@ class BridgeDependenciesResolver(
|
|||||||
|
|
||||||
val script = getScriptSource(scriptContents) ?: scriptContents.toScriptSource()
|
val script = getScriptSource(scriptContents) ?: scriptContents.toScriptSource()
|
||||||
|
|
||||||
val refineResults = scriptCompilationConfiguration.refineWith(
|
val refineResults =
|
||||||
scriptCompilationConfiguration[ScriptCompilationConfiguration.refineConfigurationOnAnnotations]?.handler,
|
scriptCompilationConfiguration.refineOnAnnotations(script, processedScriptData).onSuccess {
|
||||||
processedScriptData, script
|
it.refineBeforeCompiling(script, processedScriptData)
|
||||||
).onSuccess {
|
}
|
||||||
it.refineWith(
|
|
||||||
scriptCompilationConfiguration[ScriptCompilationConfiguration.refineConfigurationBeforeCompiling]?.handler,
|
|
||||||
processedScriptData, script
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val refinedConfiguration = when (refineResults) {
|
val refinedConfiguration = when (refineResults) {
|
||||||
is ResultWithDiagnostics.Failure ->
|
is ResultWithDiagnostics.Failure ->
|
||||||
|
|||||||
+7
-5
@@ -56,12 +56,14 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val acceptedAnnotations: List<KClass<out Annotation>> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
override val acceptedAnnotations: List<KClass<out Annotation>> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
scriptCompilationConfiguration[ScriptCompilationConfiguration.refineConfigurationOnAnnotations]?.annotations
|
scriptCompilationConfiguration[ScriptCompilationConfiguration.refineConfigurationOnAnnotations]
|
||||||
.orEmpty()
|
?.flatMap {
|
||||||
.map {
|
it.annotations.map { ann ->
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
getScriptingClass(it) as KClass<out Annotation>
|
getScriptingClass(ann) as KClass<out Annotation>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.orEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
override val implicitReceivers: List<KType> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
override val implicitReceivers: List<KType> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
|
|||||||
+10
-11
@@ -227,15 +227,12 @@ fun refineScriptCompilationConfiguration(
|
|||||||
val collectedData =
|
val collectedData =
|
||||||
getScriptCollectedData(ktFileSource.ktFile, compilationConfiguration, project, definition.contextClassLoader)
|
getScriptCollectedData(ktFileSource.ktFile, compilationConfiguration, project, definition.contextClassLoader)
|
||||||
|
|
||||||
return compilationConfiguration.refineWith(
|
return compilationConfiguration.refineOnAnnotations(script, collectedData)
|
||||||
compilationConfiguration[ScriptCompilationConfiguration.refineConfigurationOnAnnotations]?.handler, collectedData, script
|
.onSuccess {
|
||||||
).onSuccess {
|
it.refineBeforeCompiling(script, collectedData)
|
||||||
it.refineWith(
|
}.onSuccess {
|
||||||
compilationConfiguration[ScriptCompilationConfiguration.refineConfigurationBeforeCompiling]?.handler, collectedData, script
|
ScriptCompilationConfigurationWrapper.FromCompilationConfiguration(ktFileSource, it).asSuccess()
|
||||||
)
|
}
|
||||||
}.onSuccess {
|
|
||||||
ScriptCompilationConfigurationWrapper.FromCompilationConfiguration(ktFileSource, it).asSuccess()
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
val file = script.getVirtualFile(definition)
|
val file = script.getVirtualFile(definition)
|
||||||
val scriptContents =
|
val scriptContents =
|
||||||
@@ -335,8 +332,10 @@ fun getScriptCollectedData(
|
|||||||
val jvmGetScriptingClass = (getScriptingClass as? JvmGetScriptingClass)
|
val jvmGetScriptingClass = (getScriptingClass as? JvmGetScriptingClass)
|
||||||
?: throw IllegalArgumentException("Expecting JvmGetScriptingClass in the hostConfiguration[getScriptingClass], got $getScriptingClass")
|
?: throw IllegalArgumentException("Expecting JvmGetScriptingClass in the hostConfiguration[getScriptingClass], got $getScriptingClass")
|
||||||
val acceptedAnnotations =
|
val acceptedAnnotations =
|
||||||
compilationConfiguration[ScriptCompilationConfiguration.refineConfigurationOnAnnotations]?.annotations?.mapNotNull {
|
compilationConfiguration[ScriptCompilationConfiguration.refineConfigurationOnAnnotations]?.flatMap {
|
||||||
jvmGetScriptingClass(it, contextClassLoader, hostConfiguration) as? KClass<Annotation> // TODO errors
|
it.annotations.mapNotNull { ann ->
|
||||||
|
jvmGetScriptingClass(ann, contextClassLoader, hostConfiguration) as? KClass<Annotation> // TODO errors
|
||||||
|
}
|
||||||
}.orEmpty()
|
}.orEmpty()
|
||||||
val annotations = scriptFile.annotationEntries.construct(contextClassLoader, acceptedAnnotations, project)
|
val annotations = scriptFile.annotationEntries.construct(contextClassLoader, acceptedAnnotations, project)
|
||||||
return ScriptCollectedData(
|
return ScriptCollectedData(
|
||||||
|
|||||||
Reference in New Issue
Block a user