From adf012f01432332a2a3d23ec3286e02acbf57b66 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 20 Nov 2018 13:28:25 +0100 Subject: [PATCH] ActionUpdater: clone the presentation to avoid partially changing the cached one if update is interrupted --- .../openapi/actionSystem/impl/ActionUpdater.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionUpdater.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionUpdater.java index 5dc8ae50a842..8ba55ef5aa36 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionUpdater.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionUpdater.java @@ -57,10 +57,11 @@ class ActionUpdater { myTransparentOnly = transparentOnly; myRealUpdateStrategy = new UpdateStrategy( action -> { - AnActionEvent event = createActionEvent(action); - return doUpdate(myModalContext, action, event) ? event.getPresentation() : null; + // clone the presentation to avoid partially changing the cached one if update is interrupted + Presentation presentation = myFactory.getPresentation(action).clone(); + return doUpdate(myModalContext, action, createActionEvent(action, presentation)) ? presentation : null; }, - group -> group.getChildren(createActionEvent(group)), + group -> group.getChildren(createActionEvent(group, orDefault(group, myUpdatedPresentations.get(group)))), group -> group.canBePerformed(myDataContext)); myCheapStrategy = new UpdateStrategy(myFactory::getPresentation, group -> group.getChildren(null), group -> true); } @@ -196,8 +197,8 @@ class ActionUpdater { return result; } - private AnActionEvent createActionEvent(AnAction action) { - AnActionEvent event = new AnActionEvent(null, myDataContext, myPlace, orDefault(action, myUpdatedPresentations.get(action)), + private AnActionEvent createActionEvent(AnAction action, Presentation presentation) { + AnActionEvent event = new AnActionEvent(null, myDataContext, myPlace, presentation, ActionManager.getInstance(), 0, myContextMenuAction, myToolbarAction); event.setInjectedContext(action.isInInjectedContext()); return event; @@ -271,6 +272,9 @@ class ActionUpdater { Presentation presentation = strategy.update.fun(action); myUpdatedPresentations.put(action, presentation); + if (presentation != null) { + myFactory.getPresentation(action).copyFrom(presentation); + } return presentation; }