[rd debugger] Move hot swap API to rpc module

GitOrigin-RevId: adc558e1a6929b34f2895acde1c77d580661c161
This commit is contained in:
Maksim Zuev
2025-07-14 12:57:51 +00:00
committed by intellij-monorepo-bot
parent 83022a3519
commit d51fe808a8
12 changed files with 38 additions and 35 deletions
+1
View File
@@ -64,6 +64,7 @@ jvm_library(
"//java/codeserver/highlighting",
"//xml/xml-psi-api:psi",
"//platform/xdebugger-impl/shared",
"//platform/xdebugger-impl/rpc",
],
runtime_deps = [":impl_resources"]
)
@@ -97,6 +97,7 @@
<orderEntry type="module" module-name="intellij.java.codeserver.highlighting" />
<orderEntry type="module" module-name="intellij.xml.psi" />
<orderEntry type="module" module-name="intellij.platform.debugger.impl.shared" />
<orderEntry type="module" module-name="intellij.platform.debugger.impl.rpc" />
</component>
<component name="copyright">
<Base>
@@ -12,6 +12,7 @@ import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.Project;
import com.intellij.xdebugger.impl.hotswap.HotSwapStatistics;
import com.intellij.xdebugger.impl.rpc.HotSwapSource;
import org.jetbrains.annotations.NotNull;
public class HotSwapAction extends AnAction {
@@ -24,7 +25,7 @@ public class HotSwapAction extends AnAction {
DebuggerSession session = debuggerManager.getContext().getDebuggerSession();
if (session != null && session.isAttached()) {
HotSwapStatistics.logHotSwapCalled(project, HotSwapStatistics.HotSwapSource.RELOAD_ALL);
HotSwapStatistics.logHotSwapCalled(project, HotSwapSource.RELOAD_ALL);
HotSwapUI.getInstance(project).reloadChangedClasses(session, DebuggerSettings.getInstance().COMPILE_BEFORE_HOTSWAP);
}
}
@@ -11,6 +11,7 @@ import com.intellij.openapi.compiler.CompilerManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.xdebugger.impl.hotswap.HotSwapStatistics;
import com.intellij.xdebugger.impl.rpc.HotSwapSource;
import org.jetbrains.annotations.NotNull;
public class ReloadFileAction extends CompileAction {
@@ -22,7 +23,7 @@ public class ReloadFileAction extends CompileAction {
if (files.length > 0) {
DebuggerSession session = DebuggerManagerEx.getInstanceEx(project).getContext().getDebuggerSession();
if (session != null) {
HotSwapStatistics.logHotSwapCalled(project, HotSwapStatistics.HotSwapSource.RELOAD_FILE);
HotSwapStatistics.logHotSwapCalled(project, HotSwapSource.RELOAD_FILE);
HotSwapUI.getInstance(project).compileAndReload(session, files);
}
}
@@ -34,6 +34,7 @@ import com.intellij.util.containers.FileCollectionFactory;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.xdebugger.impl.hotswap.HotSwapStatistics;
import com.intellij.xdebugger.impl.hotswap.HotSwapStatusNotificationManager;
import com.intellij.xdebugger.impl.rpc.HotSwapSource;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
@@ -176,7 +177,7 @@ public final class HotSwapUIImpl extends HotSwapUI {
statusListener.onCancel(sessions);
return;
}
HotSwapStatistics.logHotSwapCalled(myProject, HotSwapStatistics.HotSwapSource.ON_REBUILD_ASK);
HotSwapStatistics.logHotSwapCalled(myProject, HotSwapSource.ON_REBUILD_ASK);
Set<DebuggerSession> toReload = new HashSet<>(dialog.getSessionsToReload());
for (DebuggerSession session : modifiedClasses.keySet()) {
if (!toReload.contains(session)) {
@@ -404,7 +405,7 @@ public final class HotSwapUIImpl extends HotSwapUI {
if (listener == null) continue;
context.putUserData(HOT_SWAP_CALLBACK_KEY, listener);
if (alwaysDoHotSwapOnRebuild) {
HotSwapStatistics.logHotSwapCalled(myProject, HotSwapStatistics.HotSwapSource.ON_REBUILD_AUTO);
HotSwapStatistics.logHotSwapCalled(myProject, HotSwapSource.ON_REBUILD_AUTO);
}
return;
}
@@ -11,6 +11,7 @@ import com.intellij.platform.project.findProject
import com.intellij.xdebugger.impl.hotswap.HotSwapSessionImpl
import com.intellij.xdebugger.impl.hotswap.HotSwapSessionManagerImpl
import com.intellij.xdebugger.impl.hotswap.HotSwapStatistics
import com.intellij.xdebugger.impl.rpc.HotSwapSource
import com.intellij.xdebugger.impl.rpc.XDebugHotSwapCurrentSessionStatus
import com.intellij.xdebugger.impl.rpc.XDebugHotSwapSessionId
import com.intellij.xdebugger.impl.rpc.XDebuggerHotSwapApi
@@ -41,7 +42,7 @@ internal class BackendXDebuggerHotSwapApi : XDebuggerHotSwapApi {
}
}
override suspend fun performHotSwap(sessionId: XDebugHotSwapSessionId, source: HotSwapStatistics.HotSwapSource) {
override suspend fun performHotSwap(sessionId: XDebugHotSwapSessionId, source: HotSwapSource) {
val session = findValueById(sessionId, type = HowSwapSessionValueIdType) ?: return
HotSwapStatistics.logHotSwapCalled(session.project, source)
session.performHotSwap()
@@ -5,12 +5,8 @@ import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.platform.project.projectId
import com.intellij.xdebugger.impl.hotswap.HotSwapStatistics
import com.intellij.xdebugger.impl.hotswap.HotSwapVisibleStatus
import com.intellij.xdebugger.impl.hotswap.NOTIFICATION_TIME_SECONDS
import com.intellij.xdebugger.impl.rpc.XDebugHotSwapCurrentSessionStatus
import com.intellij.xdebugger.impl.rpc.XDebugHotSwapSessionId
import com.intellij.xdebugger.impl.rpc.XDebuggerHotSwapApi
import com.intellij.xdebugger.impl.rpc.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
@@ -40,7 +36,7 @@ internal class FrontendHotSwapManager(private val project: Project, val coroutin
val currentStatus: XDebugHotSwapCurrentSessionStatus? get() = frontendStatusFlow.value
fun performHotSwap(sessionId: XDebugHotSwapSessionId, source: HotSwapStatistics.HotSwapSource) {
fun performHotSwap(sessionId: XDebugHotSwapSessionId, source: HotSwapSource) {
coroutineScope.launch {
XDebuggerHotSwapApi.getInstance().performHotSwap(sessionId, source)
}
@@ -22,9 +22,9 @@ import com.intellij.ui.AnimatedIcon
import com.intellij.ui.PopupHandler
import com.intellij.util.ui.JBUI
import com.intellij.xdebugger.XDebuggerBundle
import com.intellij.xdebugger.impl.hotswap.HotSwapStatistics
import com.intellij.xdebugger.impl.hotswap.HotSwapUiExtension
import com.intellij.xdebugger.impl.hotswap.HotSwapVisibleStatus
import com.intellij.xdebugger.impl.rpc.HotSwapSource
import com.intellij.xdebugger.impl.rpc.HotSwapVisibleStatus
import com.intellij.xdebugger.impl.rpc.XDebugHotSwapCurrentSessionStatus
import icons.PlatformDebuggerImplIcons
import kotlinx.coroutines.Dispatchers
@@ -64,7 +64,7 @@ internal class HotSwapModifiedFilesAction : AnAction(), DumbAware {
val project = e.project ?: return
val status = getCurrentStatus(project) ?: return
if (!status.hasChanges) return
FrontendHotSwapManager.getInstance(project).performHotSwap(status.sessionId, HotSwapStatistics.HotSwapSource.RELOAD_MODIFIED_ACTION)
FrontendHotSwapManager.getInstance(project).performHotSwap(status.sessionId, HotSwapSource.RELOAD_MODIFIED_ACTION)
}
override fun update(e: AnActionEvent) {
@@ -93,7 +93,7 @@ private class HotSwapWithRebuildAction : AnAction(), CustomComponentAction, Dumb
override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return
val status = getCurrentStatus(project) ?: return
FrontendHotSwapManager.getInstance(project).performHotSwap(status.sessionId, HotSwapStatistics.HotSwapSource.RELOAD_MODIFIED_BUTTON)
FrontendHotSwapManager.getInstance(project).performHotSwap(status.sessionId, HotSwapSource.RELOAD_MODIFIED_BUTTON)
}
override fun getActionUpdateThread() = ActionUpdateThread.EDT
@@ -5,8 +5,6 @@ import com.intellij.platform.project.ProjectId
import com.intellij.platform.rpc.Id
import com.intellij.platform.rpc.RemoteApiProviderService
import com.intellij.platform.rpc.UID
import com.intellij.xdebugger.impl.hotswap.HotSwapStatistics
import com.intellij.xdebugger.impl.hotswap.HotSwapVisibleStatus
import fleet.rpc.RemoteApi
import fleet.rpc.Rpc
import fleet.rpc.remoteApiDescriptor
@@ -18,7 +16,7 @@ import org.jetbrains.annotations.ApiStatus
@Rpc
interface XDebuggerHotSwapApi : RemoteApi<Unit> {
suspend fun currentSessionStatus(projectId: ProjectId): Flow<XDebugHotSwapCurrentSessionStatus?>
suspend fun performHotSwap(sessionId: XDebugHotSwapSessionId, source: HotSwapStatistics.HotSwapSource)
suspend fun performHotSwap(sessionId: XDebugHotSwapSessionId, source: HotSwapSource)
suspend fun hide(projectId: ProjectId)
companion object {
@@ -36,3 +34,19 @@ data class XDebugHotSwapSessionId(override val uid: UID) : Id
@ApiStatus.Internal
@Serializable
data class XDebugHotSwapCurrentSessionStatus(val sessionId: XDebugHotSwapSessionId, val status: HotSwapVisibleStatus)
@ApiStatus.Internal
enum class HotSwapVisibleStatus {
NO_CHANGES, CHANGES_READY, IN_PROGRESS, SUCCESS, HIDDEN
}
@ApiStatus.Internal
@Serializable
enum class HotSwapSource {
RELOAD_FILE,
RELOAD_ALL,
ON_REBUILD_AUTO,
ON_REBUILD_ASK,
RELOAD_MODIFIED_ACTION,
RELOAD_MODIFIED_BUTTON,
}
@@ -8,6 +8,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.platform.util.coroutines.childScope
import com.intellij.xdebugger.hotswap.*
import com.intellij.xdebugger.impl.rpc.HotSwapVisibleStatus
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.MutableStateFlow
@@ -98,11 +99,6 @@ class HotSwapSessionManagerImpl private constructor(private val project: Project
@ApiStatus.Internal
data class CurrentSessionState(val session: HotSwapSessionImpl<*>, val status: HotSwapVisibleStatus)
@ApiStatus.Internal
enum class HotSwapVisibleStatus {
NO_CHANGES, CHANGES_READY, IN_PROGRESS, SUCCESS, HIDDEN
}
private val logger = logger<HotSwapSession<*>>()
private val COMPLETED_STATUS: HotSwapVisibleStatus? = null
@@ -5,13 +5,13 @@ import com.intellij.internal.statistic.eventLog.EventLogGroup
import com.intellij.internal.statistic.eventLog.events.EventFields
import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector
import com.intellij.openapi.project.Project
import kotlinx.serialization.Serializable
import com.intellij.xdebugger.impl.rpc.HotSwapSource
import org.jetbrains.annotations.ApiStatus
@Suppress("PublicApiImplicitType")
@ApiStatus.Internal
object HotSwapStatistics : CounterUsagesCollector() {
private val group = EventLogGroup("debugger.hotswap", 1)
private val group = EventLogGroup("debugger.hotswap", 2)
private val hotSwapCalled = group.registerEvent("hotswap.called", EventFields.Enum<HotSwapSource>("source"))
private val hotSwapStatus = group.registerEvent("hotswap.finished", EventFields.Enum<HotSwapStatus>("status"))
@@ -32,16 +32,6 @@ object HotSwapStatistics : CounterUsagesCollector() {
@JvmStatic
fun logClassesReloaded(project: Project, count: Int) = hotSwapClassesNumber.log(project, count)
@Serializable
enum class HotSwapSource {
RELOAD_FILE,
RELOAD_ALL,
ON_REBUILD_AUTO,
ON_REBUILD_ASK,
RELOAD_MODIFIED_ACTION,
RELOAD_MODIFIED_BUTTON,
}
enum class HotSwapStatus {
SUCCESS,
COMPILATION_FAILURE,
@@ -8,6 +8,7 @@ import com.intellij.openapi.Disposable
import com.intellij.openapi.util.Disposer
import com.intellij.testFramework.HeavyPlatformTestCase
import com.intellij.xdebugger.hotswap.*
import com.intellij.xdebugger.impl.rpc.HotSwapVisibleStatus
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.ReceiveChannel