From eb4441210bbdbf2385d692cf9f5e1002c7afbfc8 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 13 Jun 2025 15:33:22 +0400 Subject: [PATCH] [analyzer] Avoid external caches in indexing 1. ExternalUserDataStorage 2. AnalyzerPsiCache GitOrigin-RevId: 0fb95dcac3749b18b357d449ee6d379879d0456a --- .../openapi/util/UserDataHolderBase.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/UserDataHolderBase.java b/platform/util/src/com/intellij/openapi/util/UserDataHolderBase.java index 9b4d0d5d8217..ab99b2571551 100644 --- a/platform/util/src/com/intellij/openapi/util/UserDataHolderBase.java +++ b/platform/util/src/com/intellij/openapi/util/UserDataHolderBase.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.*; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; @ReviseWhenPortedToJDK("11") // rewrite to VarHandles to avoid smelling AtomicREference inheritance @Transient @@ -16,11 +17,16 @@ public class UserDataHolderBase extends AtomicReference implements User private static final Key COPYABLE_USER_MAP_KEY = Key.create("COPYABLE_USER_MAP_KEY"); @Nullable - private static ExternalUserDataStorage ourExternalUserDataStorage = null; + private static Supplier ourExternalUserDataStorage = null; @ApiStatus.Internal - public static void setExternalUserDataStorage(@Nullable ExternalUserDataStorage externalUserDataStorage) { - ourExternalUserDataStorage = externalUserDataStorage; + public static void setExternalUserDataStorage(@Nullable Supplier supplier) { + ourExternalUserDataStorage = supplier; + } + + private static @Nullable ExternalUserDataStorage externalStorage() { + Supplier supplier = ourExternalUserDataStorage; + return supplier == null ? null : supplier.get(); } public UserDataHolderBase() { @@ -53,7 +59,7 @@ public class UserDataHolderBase extends AtomicReference implements User @Override public T getUserData(@NotNull Key key) { - ExternalUserDataStorage external = ourExternalUserDataStorage; + ExternalUserDataStorage external = externalStorage(); if (external != null) { return external.getUserData(this, key); } @@ -67,7 +73,7 @@ public class UserDataHolderBase extends AtomicReference implements User } protected @NotNull KeyFMap getUserMap() { - ExternalUserDataStorage external = ourExternalUserDataStorage; + ExternalUserDataStorage external = externalStorage(); if (external != null) { return external.getUserMap(this); } @@ -78,7 +84,7 @@ public class UserDataHolderBase extends AtomicReference implements User @Override public void putUserData(@NotNull Key key, @Nullable T value) { - ExternalUserDataStorage external = ourExternalUserDataStorage; + ExternalUserDataStorage external = externalStorage(); if (external != null) { external.putUserData(this, key, value); } @@ -103,7 +109,7 @@ public class UserDataHolderBase extends AtomicReference implements User } public void putCopyableUserData(@NotNull Key key, T value) { - ExternalUserDataStorage external = ourExternalUserDataStorage; + ExternalUserDataStorage external = externalStorage(); if (external != null) { while (true) { KeyFMap oldCopyableMap = getUserData(COPYABLE_USER_MAP_KEY); @@ -150,7 +156,7 @@ public class UserDataHolderBase extends AtomicReference implements User @Override public boolean replace(@NotNull Key key, @Nullable T oldValue, @Nullable T newValue) { - ExternalUserDataStorage external = ourExternalUserDataStorage; + ExternalUserDataStorage external = externalStorage(); if (external != null) { return external.compareAndPutUserData(this, key, oldValue, newValue); } @@ -170,7 +176,7 @@ public class UserDataHolderBase extends AtomicReference implements User @Override public @NotNull T putUserDataIfAbsent(final @NotNull Key key, final @NotNull T value) { - ExternalUserDataStorage external = ourExternalUserDataStorage; + ExternalUserDataStorage external = externalStorage(); if (external != null) { return external.putUserDataIfAbsent(this, key, value); } @@ -203,7 +209,7 @@ public class UserDataHolderBase extends AtomicReference implements User } protected void setUserMap(@NotNull KeyFMap map) { - ExternalUserDataStorage external = ourExternalUserDataStorage; + ExternalUserDataStorage external = externalStorage(); if (external != null) { external.setUserMap(this, map); }