From d0147086102b20a474f9c9ca77aed1965447cd5f Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 21 Nov 2018 08:13:31 +0100 Subject: [PATCH] cache ActionGroup#canBePerformed during update and don't run it afterwards --- .../openapi/actionSystem/impl/ActionUpdater.java | 11 ++++++++++- .../com/intellij/openapi/actionSystem/impl/Utils.java | 2 +- 2 files changed, 11 insertions(+), 2 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 8ba55ef5aa36..dafff1b2c77c 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 @@ -40,6 +40,7 @@ class ActionUpdater { private final Map myUpdatedPresentations = ContainerUtil.newIdentityTroveMap(); private final Map> myGroupChildren = ContainerUtil.newIdentityTroveMap(); + private final Map myCanBePerformedCache = ContainerUtil.newIdentityTroveMap(); private final UpdateStrategy myRealUpdateStrategy; private final UpdateStrategy myCheapStrategy; @@ -167,7 +168,7 @@ class ActionUpdater { if (actionGroup.hideIfNoVisibleChildren() && !visibleChildren) { return Collections.emptyList(); } - presentation.setEnabled(visibleChildren || strategy.canBePerformed.test(actionGroup)); + presentation.setEnabled(visibleChildren || canBePerformed(actionGroup, strategy)); } return Collections.singletonList(child); @@ -179,6 +180,14 @@ class ActionUpdater { return Collections.singletonList(child); } + boolean canBePerformedCached(ActionGroup group) { + return !Boolean.FALSE.equals(myCanBePerformedCache.get(group)); + } + + private boolean canBePerformed(ActionGroup group, UpdateStrategy strategy) { + return myCanBePerformedCache.computeIfAbsent(group, __ -> strategy.canBePerformed.test(group)); + } + private Presentation orDefault(AnAction action, Presentation presentation) { return presentation != null ? presentation : myFactory.getPresentation(action); } diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java index c5a5094fc558..5bee14d980ca 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java @@ -130,7 +130,7 @@ public class Utils{ } } else if (action instanceof ActionGroup && - !(((ActionGroup)action).canBePerformed(context) && + !(updater.canBePerformedCached((ActionGroup)action) && !updater.hasVisibleChildren((ActionGroup)action))) { ActionMenu menu = new ActionMenu(context, place, (ActionGroup)action, presentationFactory, enableMnemonics, useDarkIcons); component.add(menu);