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.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;
@@ -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() {
@@ -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)
}
return root.textContent
}
fun unescapeLineBreaks(s: String) = StringUtil.replace(s, XML_REPLACEMENTS, SOURCE_CHARS)