import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.internal.statistic.utils.PluginInfo;
import com.intellij.internal.statistic.utils.PluginInfoDetectorKt;
+import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.extensions.PluginDescriptor;
import com.intellij.openapi.keymap.Keymap;
import com.intellij.openapi.keymap.impl.DefaultKeymapImpl;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
final class ActionsBuiltInWhitelist {
return ourInstance;
}
+ private final Object myLock = new Object();
+ private final Map<AnAction, String> myDynamicActionsToId = ContainerUtil.createWeakMap();
+
private final Set<String> ourXmlActionIds = new HashSet<>();
private final Set<String> ourCustomActionWhitelist = ContainerUtil.newHashSet(
"ShowUsagesPopup.showSettings",
}
public boolean isWhitelistedActionId(@NotNull String actionId) {
- return isCustomAllowedAction(actionId) || ourXmlActionIds.contains(actionId);
+ return isCustomAllowedAction(actionId) || isStaticXmlActionId(actionId);
+ }
+
+ private boolean isStaticXmlActionId(@NotNull String actionId) {
+ synchronized (myLock) {
+ return ourXmlActionIds.contains(actionId);
+ }
}
public void addActionLoadedFromXml(@NotNull String actionId, @Nullable IdeaPluginDescriptor plugin) {
PluginInfo pluginInfo = plugin == null ? null : PluginInfoDetectorKt.getPluginInfoByDescriptor(plugin);
if (pluginInfo != null && pluginInfo.isSafeToReport()) {
- ourXmlActionIds.add(actionId);
+ synchronized (myLock) {
+ ourXmlActionIds.add(actionId);
+ }
}
}
if (keymap instanceof DefaultKeymapImpl) {
PluginDescriptor plugin = ((DefaultKeymapImpl)keymap).getPlugin();
if (PluginInfoDetectorKt.getPluginInfoByDescriptor(plugin).isDevelopedByJetBrains()) {
- ourXmlActionIds.addAll(actionIds);
+ synchronized (myLock) {
+ ourXmlActionIds.addAll(actionIds);
+ }
+ }
+ }
+ }
+
+ public void registerDynamicActionId(@NotNull AnAction action, @NotNull String id) {
+ synchronized (myLock) {
+ if (isWhitelistedActionId(id)) {
+ myDynamicActionsToId.put(action, id);
}
}
}
+
+ @Nullable
+ public String getDynamicActionId(@NotNull AnAction action) {
+ synchronized (myLock) {
+ return myDynamicActionsToId.get(action);
+ }
+ }
}
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
private static final ActionsBuiltInWhitelist ourWhitelist = ActionsBuiltInWhitelist.getInstance();
- private final Map<AnAction, String> myOtherActions = ContainerUtil.createWeakMap();
-
@Override
public void record(@Nullable String actionId, @Nullable InputEvent event, @NotNull Class context) {
String recorded = StringUtil.isNotEmpty(actionId) && ourWhitelist.isCustomAllowedAction(actionId) ? actionId : DEFAULT_ID;
@NotNull AnAction action,
@NotNull PluginInfo info) {
String actionClassName = info.isSafeToReport() ? action.getClass().getName() : DEFAULT_ID;
- String actionId = ((ActionsCollectorImpl)getInstance()).getActionId(info, action);
+ String actionId = getActionId(info, action);
if (action instanceof ActionWithDelegate) {
Object delegate = ((ActionWithDelegate<?>)action).getDelegate();
PluginInfo delegateInfo = PluginInfoDetectorKt.getPluginInfo(delegate.getClass());
@NotNull
- private String getActionId(@NotNull PluginInfo pluginInfo, @NotNull AnAction action) {
+ private static String getActionId(@NotNull PluginInfo pluginInfo, @NotNull AnAction action) {
if (!pluginInfo.isSafeToReport()) {
return DEFAULT_ID;
}
return action.getClass().getName();
}
if (actionId == null) {
- actionId = myOtherActions.get(action);
+ actionId = ourWhitelist.getDynamicActionId(action);
}
return actionId != null ? actionId : action.getClass().getName();
}
@Override
public void onActionConfiguredByActionId(@NotNull AnAction action, @NotNull String actionId) {
- if (canReportActionId(actionId)) {
- myOtherActions.put(action, actionId);
- }
+ ourWhitelist.registerDynamicActionId(action, actionId);
}
public static void onActionLoadedFromXml(@NotNull AnAction action, @NotNull String actionId, @Nullable IdeaPluginDescriptor plugin) {