From 513f49050258ed4a3266dbf27fa0d386baa0fa0a Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 29 Jun 2022 14:42:27 +0200 Subject: [PATCH] Scripting: notify writer in REPL on errors reporting complete required for restoring compatibility with IDE REPL usages (scratch files included), since IDE counterpart needs a reliable signal when the processing of the REPL snippet/command is completed --- .../jetbrains/kotlin/utils/repl/ReplEscapeType.kt | 2 ++ .../compiler/plugin/repl/ReplFromTerminal.kt | 15 ++++++++++++--- .../plugin/repl/writer/ConsoleReplWriter.kt | 1 + .../repl/writer/IdeSystemOutWrapperReplWriter.kt | 1 + .../compiler/plugin/repl/writer/ReplWriter.kt | 1 + 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/repl/ReplEscapeType.kt b/compiler/util/src/org/jetbrains/kotlin/utils/repl/ReplEscapeType.kt index 2b493ea711d..7ec82f8db98 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/repl/ReplEscapeType.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/repl/ReplEscapeType.kt @@ -27,6 +27,8 @@ enum class ReplEscapeType { COMPILE_ERROR, RUNTIME_ERROR, INTERNAL_ERROR, + ERRORS_REPORTED, // should be send after reporting all errors caused by the current command + // e.g. IDE uses it to recognize the end of command processing SUCCESS; companion object { diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/ReplFromTerminal.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/ReplFromTerminal.kt index f7e0fd41692..f37e1cfa923 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/ReplFromTerminal.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/ReplFromTerminal.kt @@ -139,10 +139,19 @@ class ReplFromTerminal( writer.outputCommandResult(tryInterpretResultAsValueClass(evalResult) ?: evalResult.toString()) } } - is ReplEvalResult.Error.Runtime -> if (evalResult.message.isNotEmpty()) writer.outputRuntimeError(evalResult.message) - is ReplEvalResult.Error.CompileTime -> if (evalResult.message.isNotEmpty()) writer.outputCompileError(evalResult.message) + is ReplEvalResult.Error.Runtime -> { + if (evalResult.message.isNotEmpty()) writer.outputRuntimeError(evalResult.message) + writer.notifyErrorsReported() + } + is ReplEvalResult.Error.CompileTime -> { + if (evalResult.message.isNotEmpty()) writer.outputCompileError(evalResult.message) + writer.notifyErrorsReported() + } is ReplEvalResult.Incomplete -> writer.notifyIncomplete() - is ReplEvalResult.HistoryMismatch -> {} // assuming handled elsewhere + is ReplEvalResult.HistoryMismatch -> { + // assuming that internal error reported elsewhere + writer.notifyErrorsReported() + } } return evalResult } diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/ConsoleReplWriter.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/ConsoleReplWriter.kt index 1209f997ae7..72c63b440ea 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/ConsoleReplWriter.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/ConsoleReplWriter.kt @@ -17,4 +17,5 @@ class ConsoleReplWriter : ReplWriter { override fun notifyIncomplete() {} override fun notifyCommandSuccess() {} override fun sendInternalErrorReport(x: String) {} + override fun notifyErrorsReported() {} } diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/IdeSystemOutWrapperReplWriter.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/IdeSystemOutWrapperReplWriter.kt index dbac95c7644..583a1b3077f 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/IdeSystemOutWrapperReplWriter.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/IdeSystemOutWrapperReplWriter.kt @@ -40,4 +40,5 @@ class IdeSystemOutWrapperReplWriter(standardOut: PrintStream) : PrintStream(stan override fun outputCompileError(x: String) = printlnWithEscaping(x, COMPILE_ERROR) override fun outputRuntimeError(x: String) = printlnWithEscaping(x, RUNTIME_ERROR) override fun sendInternalErrorReport(x: String) = printlnWithEscaping(x, INTERNAL_ERROR) + override fun notifyErrorsReported() = printlnWithEscaping("", ERRORS_REPORTED) } diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/ReplWriter.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/ReplWriter.kt index 41e296f4788..f77f9d23c85 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/ReplWriter.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/writer/ReplWriter.kt @@ -16,4 +16,5 @@ interface ReplWriter { fun outputCompileError(x: String) fun outputRuntimeError(x: String) fun sendInternalErrorReport(x: String) + fun notifyErrorsReported() }