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:
Ilya Chernikov
2019-07-22 14:14:32 +02:00
parent 65e6d3b0ff
commit 0af52f2fa6
10 changed files with 240 additions and 66 deletions
@@ -39,24 +39,17 @@ open class JvmScriptCompiler(
override suspend operator fun invoke(
script: SourceCode,
scriptCompilationConfiguration: ScriptCompilationConfiguration
): ResultWithDiagnostics<CompiledScript<*>> {
val refineConfigurationFn = scriptCompilationConfiguration[ScriptCompilationConfiguration.refineConfigurationBeforeParsing]
val refinedConfiguration =
refineConfigurationFn?.handler?.invoke(ScriptConfigurationRefinementContext(script, scriptCompilationConfiguration))?.let {
when (it) {
is ResultWithDiagnostics.Failure -> return it
is ResultWithDiagnostics.Success -> it.value
): ResultWithDiagnostics<CompiledScript<*>> =
scriptCompilationConfiguration.refineBeforeParsing(script).onSuccess { refinedConfiguration ->
val cached = cache.get(script, refinedConfiguration)
if (cached != null) return cached.asSuccess()
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)
}
}
}
}