From 2fe1f468d56c72df70e454b480c2606d7abda33b Mon Sep 17 00:00:00 2001 From: Nikolay Rykunov Date: Wed, 29 Jan 2025 06:29:04 +0100 Subject: [PATCH] [debugger-rd] IJPL-175934: Disable actions if navigation is not possible GitOrigin-RevId: 799b7334893222a5c65a9658ede51012eedd0e7b --- .../actions/FrontendXJumpToSourceAction.kt | 5 ++++ .../FrontendXJumpToTypeSourceAction.kt | 5 ++++ .../frontend/evaluate/quick/FrontendXValue.kt | 23 ++++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/actions/FrontendXJumpToSourceAction.kt b/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/actions/FrontendXJumpToSourceAction.kt index f3682c446571..fdad4b28737c 100644 --- a/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/actions/FrontendXJumpToSourceAction.kt +++ b/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/actions/FrontendXJumpToSourceAction.kt @@ -10,6 +10,7 @@ import com.intellij.xdebugger.frame.XValue import com.intellij.xdebugger.impl.actions.areFrontendDebuggerActionsEnabled import com.intellij.xdebugger.impl.rpc.XDebuggerNavigationApi import com.intellij.xdebugger.impl.ui.tree.actions.XJumpToSourceActionBase +import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl private class FrontendXJumpToSourceAction : XJumpToSourceActionBase(), ActionRemoteBehaviorSpecification.Frontend { override fun update(e: AnActionEvent) { @@ -21,6 +22,10 @@ private class FrontendXJumpToSourceAction : XJumpToSourceActionBase(), ActionRem super.update(e) } + override fun isEnabled(node: XValueNodeImpl, e: AnActionEvent): Boolean { + return super.isEnabled(node, e) && node.valueContainer.canNavigateToSource() + } + override suspend fun navigateToSource(project: Project, value: XValue): Boolean { val frontendValue = value as? FrontendXValue ?: return false return XDebuggerNavigationApi.getInstance().navigateToXValue(frontendValue.xValueDto.id).await() diff --git a/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/actions/FrontendXJumpToTypeSourceAction.kt b/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/actions/FrontendXJumpToTypeSourceAction.kt index 8f28aac00835..8206752b7641 100644 --- a/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/actions/FrontendXJumpToTypeSourceAction.kt +++ b/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/actions/FrontendXJumpToTypeSourceAction.kt @@ -10,6 +10,7 @@ import com.intellij.xdebugger.frame.XValue import com.intellij.xdebugger.impl.actions.areFrontendDebuggerActionsEnabled import com.intellij.xdebugger.impl.rpc.XDebuggerNavigationApi import com.intellij.xdebugger.impl.ui.tree.actions.XJumpToSourceActionBase +import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl private class FrontendXJumpToTypeSourceAction : XJumpToSourceActionBase(), ActionRemoteBehaviorSpecification.Frontend { override fun update(e: AnActionEvent) { @@ -21,6 +22,10 @@ private class FrontendXJumpToTypeSourceAction : XJumpToSourceActionBase(), Actio super.update(e) } + override fun isEnabled(node: XValueNodeImpl, e: AnActionEvent): Boolean { + return super.isEnabled(node, e) && node.valueContainer.canNavigateToTypeSource() + } + override suspend fun navigateToSource(project: Project, value: XValue): Boolean { val frontendValue = value as? FrontendXValue ?: return false return XDebuggerNavigationApi.getInstance().navigateToXValueType(frontendValue.xValueDto.id).await() diff --git a/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/evaluate/quick/FrontendXValue.kt b/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/evaluate/quick/FrontendXValue.kt index 57d44433eb23..f721779c8525 100644 --- a/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/evaluate/quick/FrontendXValue.kt +++ b/platform/xdebugger-impl/frontend/src/com/intellij/platform/debugger/impl/frontend/evaluate/quick/FrontendXValue.kt @@ -18,7 +18,6 @@ import com.intellij.xdebugger.frame.XValueModifier import com.intellij.xdebugger.frame.XValueNode import com.intellij.xdebugger.frame.XValuePlace import com.intellij.xdebugger.frame.presentation.XValuePresentation -import com.intellij.xdebugger.impl.evaluate.quick.HintXValue import com.intellij.xdebugger.impl.rhizome.XValueMarkerDto import com.intellij.xdebugger.impl.rpc.XDebuggerEvaluatorApi import com.intellij.xdebugger.impl.rpc.XValueAdvancedPresentationPart @@ -28,6 +27,9 @@ import com.intellij.xdebugger.impl.rpc.XValuePresentationEvent import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeEx import kotlinx.coroutines.* import kotlinx.coroutines.flow.collectLatest +import org.jetbrains.concurrency.Promise +import org.jetbrains.concurrency.asCompletableFuture +import org.jetbrains.concurrency.asPromise internal class FrontendXValue( private val project: Project, @@ -48,6 +50,9 @@ internal class FrontendXValue( var markerDto: XValueMarkerDto? = null + @Volatile + private var canNavigateToTypeSource = false + init { cs.launch { val canBeModified = xValueDto.canBeModified.await() @@ -75,6 +80,22 @@ internal class FrontendXValue( } } } + + cs.launch { + canNavigateToTypeSource = xValueDto.canNavigateToTypeSource.await() + } + } + + override fun canNavigateToSource(): Boolean { + return xValueDto.canNavigateToSource + } + + override fun canNavigateToTypeSource(): Boolean { + return canNavigateToTypeSource + } + + override fun canNavigateToTypeSourceAsync(): Promise? { + return canNavigateToTypeSourceAsync()?.asCompletableFuture()?.asPromise() } override fun computePresentation(node: XValueNode, place: XValuePlace) {