IJPL-188924 Rewrite Build for Remote Development

make sure new implementation doesn't break CWM workflow

GitOrigin-RevId: a87f0f364e86112ee1c9478312823905bf75cdf8
This commit is contained in:
Dmitry Batrak
2026-01-15 15:46:08 +00:00
committed by intellij-monorepo-bot
parent 8b98eacad9
commit cbe21bc5c0
3 changed files with 45 additions and 36 deletions
@@ -1,47 +1,15 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.buildView.backend
import com.intellij.build.*
import com.intellij.openapi.application.EDT
import com.intellij.openapi.util.Disposer
import com.intellij.platform.buildView.BuildViewApi
import com.intellij.platform.project.ProjectId
import com.intellij.platform.project.findProject
import com.intellij.platform.buildView.BuildViewApiImpl
import com.intellij.platform.rpc.backend.RemoteApiProvider
import fleet.rpc.remoteApiDescriptor
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext
internal class BuildViewApiProvider : RemoteApiProvider {
override fun RemoteApiProvider.Sink.remoteApis() {
remoteApi(remoteApiDescriptor<BuildViewApi>()) {
BuildViewApiImpl()
}
}
}
private class BuildViewApiImpl : BuildViewApi {
override suspend fun getBuildViewEventsFlow(projectId: ProjectId): Flow<BuildViewEvent> {
return BuildViewViewModel.getInstance(projectId.findProject()).getFlowWithHistory()
}
override suspend fun setBuildContentPinned(buildContentId: BuildContentId, pinned: Boolean) {
val content = BackendMultipleBuildsView.getById(buildContentId) ?: return
content.pinned = pinned
}
override suspend fun disposeBuildContent(buildContentId: BuildContentId) {
val content = BackendMultipleBuildsView.getById(buildContentId) ?: return
withContext(Dispatchers.EDT) {
Disposer.dispose(content)
}
}
override suspend fun notifyTooWindowActivated(buildId: BuildId) {
val callback = BackendMultipleBuildsView.getToolWindowActivationCallback(buildId) ?: return
withContext(Dispatchers.EDT) {
callback.run()
BuildViewApiImpl
}
}
}
+5 -2
View File
@@ -1,9 +1,11 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.buildView
import com.intellij.build.BuildViewEvent
import com.intellij.build.BuildContentId
import com.intellij.build.BuildId
import com.intellij.build.BuildViewEvent
import com.intellij.frontend.FrontendApplicationInfo
import com.intellij.frontend.FrontendType
import com.intellij.platform.project.ProjectId
import com.intellij.platform.rpc.RemoteApiProviderService
import fleet.rpc.RemoteApi
@@ -45,7 +47,8 @@ interface BuildViewApi : RemoteApi<Unit> {
companion object {
suspend fun getInstance(): BuildViewApi {
return RemoteApiProviderService.resolve(remoteApiDescriptor<BuildViewApi>())
val isCWM = (FrontendApplicationInfo.getFrontendType() as? FrontendType.Remote)?.isGuest() == true
return if (isCWM) BuildViewApiImpl else RemoteApiProviderService.resolve(remoteApiDescriptor<BuildViewApi>())
}
}
}
@@ -0,0 +1,38 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.buildView
import com.intellij.build.*
import com.intellij.openapi.application.EDT
import com.intellij.openapi.util.Disposer
import com.intellij.platform.project.ProjectId
import com.intellij.platform.project.findProject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
object BuildViewApiImpl : BuildViewApi {
override suspend fun getBuildViewEventsFlow(projectId: ProjectId): Flow<BuildViewEvent> {
return BuildViewViewModel.getInstance(projectId.findProject()).getFlowWithHistory()
}
override suspend fun setBuildContentPinned(buildContentId: BuildContentId, pinned: Boolean) {
val content = BackendMultipleBuildsView.getById(buildContentId) ?: return
content.pinned = pinned
}
override suspend fun disposeBuildContent(buildContentId: BuildContentId) {
val content = BackendMultipleBuildsView.getById(buildContentId) ?: return
withContext(Dispatchers.EDT) {
Disposer.dispose(content)
}
}
override suspend fun notifyTooWindowActivated(buildId: BuildId) {
val callback = BackendMultipleBuildsView.getToolWindowActivationCallback(buildId) ?: return
withContext(Dispatchers.EDT) {
callback.run()
}
}
}