Repl: fix bug in handling multiline commands

This commit is contained in:
Dmitry Kovanikov
2015-09-22 16:37:13 +03:00
committed by Pavel V. Talanov
parent 4ca8a51234
commit bfe01cccea
3 changed files with 17 additions and 5 deletions
@@ -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.ReplErrorLogger;
import org.jetbrains.kotlin.cli.jvm.repl.messages.ReplSystemInWrapper; 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.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.ConsoleReplCommandReader;
import org.jetbrains.kotlin.cli.jvm.repl.reader.IdeReplCommandReader; import org.jetbrains.kotlin.cli.jvm.repl.reader.IdeReplCommandReader;
import org.jetbrains.kotlin.cli.jvm.repl.reader.ReplCommandReader; import org.jetbrains.kotlin.cli.jvm.repl.reader.ReplCommandReader;
@@ -159,6 +160,8 @@ public class ReplFromTerminal {
return WhatNextAfterOneLine.QUIT; return WhatNextAfterOneLine.QUIT;
} }
line = UnescapeUtilsKt.unescapeLineBreaks(line);
if (line.startsWith(":") && (line.length() == 1 || line.charAt(1) != ':')) { if (line.startsWith(":") && (line.length() == 1 || line.charAt(1) != ':')) {
boolean notQuit = oneCommand(line.substring(1)); boolean notQuit = oneCommand(line.substring(1));
return notQuit ? WhatNextAfterOneLine.READ_LINE : WhatNextAfterOneLine.QUIT; return notQuit ? WhatNextAfterOneLine.READ_LINE : WhatNextAfterOneLine.QUIT;
@@ -33,7 +33,7 @@ public class ReplSystemInWrapper(
private val isAtBufferEnd: Boolean private val isAtBufferEnd: Boolean
get() = curBytePos == inputByteArray.size() get() = curBytePos == inputByteArray.size()
var isReplScriptExecuting = false @Volatile var isReplScriptExecuting = false
override fun read(): Int { override fun read(): Int {
if (isLastByteProcessed) { if (isLastByteProcessed) {
@@ -47,7 +47,7 @@ public class ReplSystemInWrapper(
} }
while (isXmlIncomplete) { while (isXmlIncomplete) {
if (isReplScriptExecuting && !isReadLineStartSent) { if (!isReadLineStartSent && isReplScriptExecuting) {
replWriter.printlnReadLineStart() replWriter.printlnReadLineStart()
isReadLineStartSent = true isReadLineStartSent = true
} }
@@ -69,7 +69,14 @@ public class ReplSystemInWrapper(
private fun parseInput(): String { private fun parseInput(): String {
val xmlInput = byteBuilder.toString() 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() { private fun resetBufferIfNeeded() {
@@ -34,5 +34,7 @@ fun parseXml(inputMessage: String): String {
val input = docBuilder.parse(strToSource(inputMessage)) val input = docBuilder.parse(strToSource(inputMessage))
val root = input.firstChild as Element val root = input.firstChild as Element
return StringUtil.replace(root.textContent, XML_REPLACEMENTS, SOURCE_CHARS) return root.textContent
} }
fun unescapeLineBreaks(s: String) = StringUtil.replace(s, XML_REPLACEMENTS, SOURCE_CHARS)