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.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)
|
||||||
Reference in New Issue
Block a user