From 3f44fe5955bfec566652feae65cd0c9007e92fa9 Mon Sep 17 00:00:00 2001 From: Dmitry Kovanikov Date: Thu, 10 Sep 2015 12:20:34 +0300 Subject: [PATCH] [cli-repl] Optimize `System.in` to send "change indicator" message only when readLine is called --- .../jvm/repl/messages/ReplSystemInWrapper.kt | 20 +++++++++--------- .../kotlin/console/KotlinConsoleRunner.kt | 21 ++++++++++++++----- .../highlight/KotlinHistoryHighlighter.kt | 11 ++++------ 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/ReplSystemInWrapper.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/ReplSystemInWrapper.kt index 2b43f5592c0..91c23b765a6 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/ReplSystemInWrapper.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/messages/ReplSystemInWrapper.kt @@ -25,30 +25,30 @@ public class ReplSystemInWrapper( ) : InputStream() { private var isXmlIncomplete = true private var isLastScriptByteProcessed = false + private var isReadLineStartSent = false private var byteBuilder = ByteArrayOutputStream() private var curBytePos = 0 private var inputByteArray = byteArrayOf() - private val isReachBufferEnd: Boolean + private val isAtBufferEnd: Boolean get() = curBytePos == inputByteArray.size() var isReplScriptExecuting = false - set(value) { - if (value) - replWriter.printlnReadLineStart() - else - replWriter.printlnReadLineEnd() - - $isReplScriptExecuting = value - } override fun read(): Int { if (isLastScriptByteProcessed && isReplScriptExecuting) { isLastScriptByteProcessed = false + isReadLineStartSent = false + replWriter.printlnReadLineEnd() return -1 } while (isXmlIncomplete) { + if (isReplScriptExecuting && !isReadLineStartSent) { + replWriter.printlnReadLineStart() + isReadLineStartSent = true + } + byteBuilder.write(stdin.read()) if (byteBuilder.toString().endsWith(END_LINE)) { @@ -77,7 +77,7 @@ public class ReplSystemInWrapper( } private fun resetBufferIfNeeded() { - if (isReachBufferEnd) { + if (isAtBufferEnd) { isXmlIncomplete = true byteBuilder = ByteArrayOutputStream() curBytePos = 0 diff --git a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt index 5e712c35a24..ab5f37267f9 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt @@ -18,14 +18,25 @@ package org.jetbrains.kotlin.console import com.intellij.execution.Executor import com.intellij.execution.configurations.GeneralCommandLine -import com.intellij.execution.console.* -import com.intellij.execution.process.* +import com.intellij.execution.console.ConsoleExecuteAction +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.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.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.project.Project import com.intellij.openapi.util.Disposer @@ -172,7 +183,7 @@ public class KotlinConsoleRunner( return indicatorHighlighter apply { gutterIconRenderer = indicator } } - fun changeConsoleEditorIndicator(newIconWithTooltip: IconWithTooltip) { + fun changeConsoleEditorIndicator(newIconWithTooltip: IconWithTooltip) = WriteCommandAction.runWriteCommandAction(project) { consoleEditorHighlighter.gutterIconRenderer = KotlinConsoleIndicatorRenderer(newIconWithTooltip) } diff --git a/idea/idea-repl/src/org/jetbrains/kotlin/console/highlight/KotlinHistoryHighlighter.kt b/idea/idea-repl/src/org/jetbrains/kotlin/console/highlight/KotlinHistoryHighlighter.kt index 045c5403c12..98198e679ee 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/console/highlight/KotlinHistoryHighlighter.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/console/highlight/KotlinHistoryHighlighter.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.console.highlight 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.util.EditorUtil import com.intellij.openapi.editor.markup.HighlighterLayer @@ -32,12 +31,10 @@ public class KotlinHistoryHighlighter(private val runner: KotlinConsoleRunner ) var isReadLineMode: Boolean = false set(value) { - WriteCommandAction.runWriteCommandAction(runner.project) { - if (value) - runner.changeConsoleEditorIndicator(ReplIcons.EDITOR_READLINE_INDICATOR) - else - runner.changeConsoleEditorIndicator(ReplIcons.EDITOR_INDICATOR) - } + if (value) + runner.changeConsoleEditorIndicator(ReplIcons.EDITOR_READLINE_INDICATOR) + else + runner.changeConsoleEditorIndicator(ReplIcons.EDITOR_INDICATOR) $isReadLineMode = value }