Repl: fix bug in handling multiline commands
This commit is contained in:
committed by
Pavel V. Talanov
parent
4ca8a51234
commit
bfe01cccea
@@ -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)
|
||||
Reference in New Issue
Block a user