[cli-repl] Optimize System.in to send "change indicator" message only when readLine is called

This commit is contained in:
Dmitry Kovanikov
2015-09-10 12:20:34 +03:00
committed by Pavel V. Talanov
parent 1f4fab0047
commit 3f44fe5955
3 changed files with 30 additions and 22 deletions
@@ -25,30 +25,30 @@ public class ReplSystemInWrapper(
) : InputStream() { ) : InputStream() {
private var isXmlIncomplete = true private var isXmlIncomplete = true
private var isLastScriptByteProcessed = false private var isLastScriptByteProcessed = false
private var isReadLineStartSent = false
private var byteBuilder = ByteArrayOutputStream() private var byteBuilder = ByteArrayOutputStream()
private var curBytePos = 0 private var curBytePos = 0
private var inputByteArray = byteArrayOf() private var inputByteArray = byteArrayOf()
private val isReachBufferEnd: Boolean private val isAtBufferEnd: Boolean
get() = curBytePos == inputByteArray.size() get() = curBytePos == inputByteArray.size()
var isReplScriptExecuting = false var isReplScriptExecuting = false
set(value) {
if (value)
replWriter.printlnReadLineStart()
else
replWriter.printlnReadLineEnd()
$isReplScriptExecuting = value
}
override fun read(): Int { override fun read(): Int {
if (isLastScriptByteProcessed && isReplScriptExecuting) { if (isLastScriptByteProcessed && isReplScriptExecuting) {
isLastScriptByteProcessed = false isLastScriptByteProcessed = false
isReadLineStartSent = false
replWriter.printlnReadLineEnd()
return -1 return -1
} }
while (isXmlIncomplete) { while (isXmlIncomplete) {
if (isReplScriptExecuting && !isReadLineStartSent) {
replWriter.printlnReadLineStart()
isReadLineStartSent = true
}
byteBuilder.write(stdin.read()) byteBuilder.write(stdin.read())
if (byteBuilder.toString().endsWith(END_LINE)) { if (byteBuilder.toString().endsWith(END_LINE)) {
@@ -77,7 +77,7 @@ public class ReplSystemInWrapper(
} }
private fun resetBufferIfNeeded() { private fun resetBufferIfNeeded() {
if (isReachBufferEnd) { if (isAtBufferEnd) {
isXmlIncomplete = true isXmlIncomplete = true
byteBuilder = ByteArrayOutputStream() byteBuilder = ByteArrayOutputStream()
curBytePos = 0 curBytePos = 0
@@ -18,14 +18,25 @@ package org.jetbrains.kotlin.console
import com.intellij.execution.Executor import com.intellij.execution.Executor
import com.intellij.execution.configurations.GeneralCommandLine import com.intellij.execution.configurations.GeneralCommandLine
import com.intellij.execution.console.* import com.intellij.execution.console.ConsoleExecuteAction
import com.intellij.execution.process.* import com.intellij.execution.console.LanguageConsoleBuilder
import com.intellij.execution.console.LanguageConsoleView
import com.intellij.execution.console.ProcessBackedConsoleExecuteActionHandler
import com.intellij.execution.process.OSProcessHandler
import com.intellij.execution.process.ProcessAdapter
import com.intellij.execution.process.ProcessEvent
import com.intellij.execution.runners.AbstractConsoleRunnerWithHistory import com.intellij.execution.runners.AbstractConsoleRunnerWithHistory
import com.intellij.execution.ui.RunContentDescriptor import com.intellij.execution.ui.RunContentDescriptor
import com.intellij.openapi.actionSystem.* import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.CommonShortcuts
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.openapi.command.WriteCommandAction
import com.intellij.openapi.editor.colors.EditorColors import com.intellij.openapi.editor.colors.EditorColors
import com.intellij.openapi.editor.ex.EditorEx import com.intellij.openapi.editor.ex.EditorEx
import com.intellij.openapi.editor.markup.* import com.intellij.openapi.editor.markup.HighlighterLayer
import com.intellij.openapi.editor.markup.HighlighterTargetArea
import com.intellij.openapi.editor.markup.RangeHighlighter
import com.intellij.openapi.editor.markup.TextAttributes
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.Disposer
@@ -172,7 +183,7 @@ public class KotlinConsoleRunner(
return indicatorHighlighter apply { gutterIconRenderer = indicator } return indicatorHighlighter apply { gutterIconRenderer = indicator }
} }
fun changeConsoleEditorIndicator(newIconWithTooltip: IconWithTooltip) { fun changeConsoleEditorIndicator(newIconWithTooltip: IconWithTooltip) = WriteCommandAction.runWriteCommandAction(project) {
consoleEditorHighlighter.gutterIconRenderer = KotlinConsoleIndicatorRenderer(newIconWithTooltip) consoleEditorHighlighter.gutterIconRenderer = KotlinConsoleIndicatorRenderer(newIconWithTooltip)
} }
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.console.highlight package org.jetbrains.kotlin.console.highlight
import com.intellij.execution.console.LanguageConsoleImpl import com.intellij.execution.console.LanguageConsoleImpl
import com.intellij.openapi.command.WriteCommandAction
import com.intellij.openapi.editor.ex.EditorEx import com.intellij.openapi.editor.ex.EditorEx
import com.intellij.openapi.editor.ex.util.EditorUtil import com.intellij.openapi.editor.ex.util.EditorUtil
import com.intellij.openapi.editor.markup.HighlighterLayer import com.intellij.openapi.editor.markup.HighlighterLayer
@@ -32,12 +31,10 @@ public class KotlinHistoryHighlighter(private val runner: KotlinConsoleRunner )
var isReadLineMode: Boolean = false var isReadLineMode: Boolean = false
set(value) { set(value) {
WriteCommandAction.runWriteCommandAction(runner.project) { if (value)
if (value) runner.changeConsoleEditorIndicator(ReplIcons.EDITOR_READLINE_INDICATOR)
runner.changeConsoleEditorIndicator(ReplIcons.EDITOR_READLINE_INDICATOR) else
else runner.changeConsoleEditorIndicator(ReplIcons.EDITOR_INDICATOR)
runner.changeConsoleEditorIndicator(ReplIcons.EDITOR_INDICATOR)
}
$isReadLineMode = value $isReadLineMode = value
} }