From bfe01cccea5d7266dceef1352bc29e97ceebf7f2 Mon Sep 17 00:00:00 2001 From: Dmitry Kovanikov Date: Tue, 22 Sep 2015 16:37:13 +0300 Subject: [PATCH] Repl: fix bug in handling multiline commands --- .../kotlin/cli/jvm/repl/ReplFromTerminal.java | 3 +++ .../cli/jvm/repl/messages/ReplSystemInWrapper.kt | 13 ++++++++++--- .../kotlin/cli/jvm/repl/messages/UnescapeUtils.kt | 6 ++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplFromTerminal.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplFromTerminal.java index 942e56f0219..efd2d47d7f4 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplFromTerminal.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplFromTerminal.java @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.cli.common.KotlinVersion; import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplErrorLogger; import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplSystemInWrapper; import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplSystemOutWrapper; +import org.jetbrains.kotlin.cli.jvm.repl.messages.UnescapeUtilsKt; import org.jetbrains.kotlin.cli.jvm.repl.reader.ConsoleReplCommandReader; import org.jetbrains.kotlin.cli.jvm.repl.reader.IdeReplCommandReader; import org.jetbrains.kotlin.cli.jvm.repl.reader.ReplCommandReader; @@ -159,6 +160,8 @@ public class ReplFromTerminal { return WhatNextAfterOneLine.QUIT; } + line = UnescapeUtilsKt.unescapeLineBreaks(line); + if (line.startsWith(":") && (line.length() == 1 || line.charAt(1) != ':')) { boolean notQuit = oneCommand(line.substring(1)); return notQuit ? WhatNextAfterOneLine.READ_LINE : WhatNextAfterOneLine.QUIT; diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/ReplSystemInWrapper.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/ReplSystemInWrapper.kt index 191b37b459d..6932d0b3976 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/ReplSystemInWrapper.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/ReplSystemInWrapper.kt @@ -33,7 +33,7 @@ public class ReplSystemInWrapper( private val isAtBufferEnd: Boolean get() = curBytePos == inputByteArray.size() - var isReplScriptExecuting = false + @Volatile var isReplScriptExecuting = false override fun read(): Int { if (isLastByteProcessed) { @@ -47,7 +47,7 @@ public class ReplSystemInWrapper( } while (isXmlIncomplete) { - if (isReplScriptExecuting && !isReadLineStartSent) { + if (!isReadLineStartSent && isReplScriptExecuting) { replWriter.printlnReadLineStart() isReadLineStartSent = true } @@ -69,7 +69,14 @@ public class ReplSystemInWrapper( private fun parseInput(): String { val xmlInput = byteBuilder.toString() - return "${parseXml(xmlInput)}$END_LINE" + val unescapedXml = parseXml(xmlInput) + + val resultLine = if (isReplScriptExecuting) + unescapeLineBreaks(unescapedXml) + else + unescapedXml + + return "$resultLine$END_LINE" } private fun resetBufferIfNeeded() { diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/UnescapeUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/UnescapeUtils.kt index 16a769604f5..3ce7b58210b 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/UnescapeUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/UnescapeUtils.kt @@ -34,5 +34,7 @@ fun parseXml(inputMessage: String): String { val input = docBuilder.parse(strToSource(inputMessage)) val root = input.firstChild as Element - return StringUtil.replace(root.textContent, XML_REPLACEMENTS, SOURCE_CHARS) -} \ No newline at end of file + return root.textContent +} + +fun unescapeLineBreaks(s: String) = StringUtil.replace(s, XML_REPLACEMENTS, SOURCE_CHARS) \ No newline at end of file