[terminal] IJ-MR-158015 Refactor FusAwareTtyBasedDataStream

Use delegation instead of inheritance. Make the class private.

GitOrigin-RevId: 249caf3ac6ab166dd715e172692477f81949ebd5
This commit is contained in:
Sergei Tachenov
2025-04-15 07:32:53 +00:00
committed by intellij-monorepo-bot
parent daef3c9e81
commit dc39c87f5f
3 changed files with 37 additions and 38 deletions
@@ -15,6 +15,7 @@ import com.jediterm.core.typeahead.TerminalTypeAheadManager
import com.jediterm.core.util.TermSize
import com.jediterm.terminal.TerminalExecutorServiceManager
import com.jediterm.terminal.TerminalStarter
import com.jediterm.terminal.TtyBasedArrayDataStream
import com.jediterm.terminal.TtyConnector
import com.jediterm.terminal.model.JediTermTypeAheadModel
import com.jediterm.terminal.model.StyleState
@@ -23,7 +24,6 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.launch
import org.jetbrains.plugins.terminal.FusAwareTtyBasedDataStream
import org.jetbrains.plugins.terminal.LocalBlockTerminalRunner
import org.jetbrains.plugins.terminal.ShellStartupOptions
import org.jetbrains.plugins.terminal.fus.BackendOutputActivity
@@ -115,7 +115,7 @@ private fun createJediTermServices(
val terminalStarter = StopAwareTerminalStarter(
controller,
connector,
FusAwareTtyBasedDataStream(connector, fusActivity),
enableFus(TtyBasedArrayDataStream(connector), fusActivity),
typeAheadManager,
executorService,
fusActivity
@@ -5,6 +5,8 @@ import com.intellij.platform.rpc.UID
import com.intellij.terminal.session.TerminalContentUpdatedEvent
import com.intellij.terminal.session.TerminalWriteBytesEvent
import com.jediterm.core.util.TermSize
import com.jediterm.terminal.TerminalDataStream
import com.jediterm.terminal.TtyBasedArrayDataStream
import com.jediterm.terminal.TtyConnector
import fleet.multiplatform.shims.ConcurrentHashMap
import org.jetbrains.plugins.terminal.fus.BackendLatencyService
@@ -38,6 +40,9 @@ internal class BackendLatencyServiceImpl : BackendLatencyService {
internal fun enableFus(ttyConnector: TtyConnector, fusActivity: BackendOutputActivity): TtyConnector =
FusAwareTtyConnector(ttyConnector, fusActivity)
internal fun enableFus(stream: TerminalDataStream, fusActivity: BackendOutputActivity): TerminalDataStream =
FusAwareTtyBasedDataStream(stream, fusActivity)
private val backendTypingActivityByByteArray = ConcurrentHashMap<ByteArray, BackendTypingActivityImpl>()
private class BackendTypingActivityImpl(override val id: Int, private val bytes: ByteArray) : BackendTypingActivity {
@@ -334,6 +339,36 @@ private class IdentityWrapper<T : Any>(private val instance: T) {
override fun hashCode(): Int = System.identityHashCode(instance)
}
private class FusAwareTtyBasedDataStream(
private val original: TerminalDataStream,
private val fusActivity: BackendOutputActivity,
) : TerminalDataStream {
override fun getChar(): Char {
@Suppress("UsePropertyAccessSyntax")
val result = original.getChar()
fusActivity.charsProcessed(1)
return result
}
override fun pushChar(c: Char) {
fusActivity.charsProcessed(-1)
original.pushChar(c)
}
override fun readNonControlCharacters(maxChars: Int): String? {
val result = original.readNonControlCharacters(maxChars)
fusActivity.charsProcessed(result.length)
return result
}
override fun pushBackBuffer(bytes: CharArray, length: Int) {
fusActivity.charsProcessed(-length)
original.pushBackBuffer(bytes, length)
}
override fun isEmpty(): Boolean = original.isEmpty
}
private fun <T : Any> T.toIdentity(): IdentityWrapper<T> = IdentityWrapper(this)
private val LOG = logger<BackendLatencyService>()
@@ -1,36 +0,0 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.terminal
import com.jediterm.terminal.TtyBasedArrayDataStream
import com.jediterm.terminal.TtyConnector
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.plugins.terminal.fus.BackendOutputActivity
@ApiStatus.Internal
class FusAwareTtyBasedDataStream(
connector: TtyConnector,
private val fusActivity: BackendOutputActivity,
) : TtyBasedArrayDataStream(connector) {
override fun getChar(): Char {
val result = super.getChar()
fusActivity.charsProcessed(1)
return result
}
override fun readNonControlCharacters(maxChars: Int): String {
val result = super.readNonControlCharacters(maxChars)
fusActivity.charsProcessed(result.length)
return result
}
override fun pushChar(c: Char) {
fusActivity.charsProcessed(-1)
super.pushChar(c)
}
override fun pushBackBuffer(bytes: CharArray, length: Int) {
fusActivity.charsProcessed(-length)
super.pushBackBuffer(bytes, length)
}
}