Publish ExecStatusEvent taking into account its channel name

This commit is contained in:
Alexey Alekhin 2017-11-14 21:53:15 +01:00
parent 5c394e18f6
commit 6b6047b55c
1 changed files with 26 additions and 9 deletions

View File

@ -26,7 +26,7 @@ import sbt.internal.server._
import sbt.internal.langserver.{ LogMessageParams, MessageType }
import sbt.internal.util.{ StringEvent, ObjectEvent, MainAppender }
import sbt.internal.util.codec.JValueFormats
import sbt.protocol.{ EventMessage, Serialization }
import sbt.protocol.{ EventMessage, ExecStatusEvent }
import sbt.util.{ Level, Logger, LogExchange }
/**
@ -170,10 +170,11 @@ private[sbt] final class CommandExchange {
def publishEvent[A: JsonFormat](event: A): Unit = {
val broadcastStringMessage = true
val toDel: ListBuffer[CommandChannel] = ListBuffer.empty
event match {
case entry: StringEvent =>
val params = toLogMessageParams(entry)
channels.foreach {
channels collect {
case c: ConsoleChannel =>
if (broadcastStringMessage) {
c.publishEvent(event)
@ -201,7 +202,7 @@ private[sbt] final class CommandExchange {
}
}
case _ =>
channels.foreach {
channels collect {
case c: ConsoleChannel =>
c.publishEvent(event)
case c: NetworkChannel =>
@ -243,7 +244,7 @@ private[sbt] final class CommandExchange {
JField("execId", JString(execId))
})): _*
)
channels.foreach {
channels collect {
case c: ConsoleChannel =>
c.publishEvent(json)
case c: NetworkChannel =>
@ -268,16 +269,32 @@ private[sbt] final class CommandExchange {
val toDel: ListBuffer[CommandChannel] = ListBuffer.empty
event match {
// Special treatment for ConsolePromptEvent since it's hand coded without codec.
case e: ConsolePromptEvent =>
case entry: ConsolePromptEvent =>
channels collect {
case c: ConsoleChannel => c.publishEventMessage(e)
case c: ConsoleChannel => c.publishEventMessage(entry)
}
case e: ConsoleUnpromptEvent =>
case entry: ConsoleUnpromptEvent =>
channels collect {
case c: ConsoleChannel => c.publishEventMessage(e)
case c: ConsoleChannel => c.publishEventMessage(entry)
}
case entry: ExecStatusEvent =>
channels collect {
case c: ConsoleChannel =>
if (entry.channelName.isEmpty || entry.channelName == Some(c.name)) {
c.publishEventMessage(event)
}
case c: NetworkChannel =>
try {
if (entry.channelName == Some(c.name)) {
c.publishEventMessage(event)
}
} catch {
case e: SocketException =>
toDel += c
}
}
case _ =>
channels.foreach {
channels collect {
case c: ConsoleChannel =>
c.publishEventMessage(event)
case c: NetworkChannel =>