From 45eaca12905c3131bea4e9e2929cb839e5621532 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 23 Jul 2018 16:28:18 +0200 Subject: [PATCH] Add diagnostics chaining --- .../script/experimental/api/errorHandling.kt | 16 ++++++++++++++++ .../experimental/host/BasicScriptingHost.kt | 8 ++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/errorHandling.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/errorHandling.kt index 9345f2eae73..e90363d4d7c 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/errorHandling.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/errorHandling.kt @@ -31,11 +31,27 @@ sealed class ResultWithDiagnostics { } } +// call chaining + +suspend fun ResultWithDiagnostics.onSuccess(body: suspend (R1) -> ResultWithDiagnostics): ResultWithDiagnostics = when (this) { + is ResultWithDiagnostics.Success -> this.reports + body(this.value) + is ResultWithDiagnostics.Failure -> this +} + +suspend fun ResultWithDiagnostics.onFailure(body: suspend (ResultWithDiagnostics) -> Unit): ResultWithDiagnostics { + if (this is ResultWithDiagnostics.Failure) { + body(this) + } + return this +} + operator fun List.plus(res: ResultWithDiagnostics): ResultWithDiagnostics = when (res) { is ResultWithDiagnostics.Success -> ResultWithDiagnostics.Success(res.value, this + res.reports) is ResultWithDiagnostics.Failure -> ResultWithDiagnostics.Failure(this + res.reports) } +// results creation + fun R.asSuccess(reports: List = listOf()): ResultWithDiagnostics.Success = ResultWithDiagnostics.Success(this, reports) diff --git a/libraries/scripting/common/src/kotlin/script/experimental/host/BasicScriptingHost.kt b/libraries/scripting/common/src/kotlin/script/experimental/host/BasicScriptingHost.kt index bf2830e806c..1e42dfdceb0 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/host/BasicScriptingHost.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/host/BasicScriptingHost.kt @@ -35,12 +35,8 @@ abstract class BasicScriptingHost( environment: ScriptEvaluationEnvironment ): ResultWithDiagnostics = runInCoroutineContext { - val compiled = compiler(script, scriptDefinition, compileConfiguration) - when (compiled) { - is ResultWithDiagnostics.Failure -> compiled - is ResultWithDiagnostics.Success -> { - evaluator(compiled.value, environment) - } + compiler(script, scriptDefinition, compileConfiguration).onSuccess { + evaluator(it, environment) } } }