diff --git a/platform/core-api/src/com/intellij/psi/util/CachedValuesManager.java b/platform/core-api/src/com/intellij/psi/util/CachedValuesManager.java index 49391709ed00..f3d9f5382914 100644 --- a/platform/core-api/src/com/intellij/psi/util/CachedValuesManager.java +++ b/platform/core-api/src/com/intellij/psi/util/CachedValuesManager.java @@ -21,9 +21,12 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NotNullLazyKey; import com.intellij.openapi.util.UserDataHolder; import com.intellij.openapi.util.UserDataHolderEx; -import org.jetbrains.annotations.NonNls; +import com.intellij.util.ConcurrencyUtil; +import com.intellij.util.containers.ConcurrentHashMap; import org.jetbrains.annotations.NotNull; +import java.util.concurrent.ConcurrentMap; + public abstract class CachedValuesManager { private static final NotNullLazyKey INSTANCE_KEY = ServiceManager.createLazyKey(CachedValuesManager.class); @@ -83,31 +86,21 @@ public abstract class CachedValuesManager { * @return up-to-date value. */ public abstract T getCachedValue(@NotNull D dataHolder, - @NotNull Key> key, - @NotNull CachedValueProvider provider, - boolean trackValue); + @NotNull Key> key, + @NotNull CachedValueProvider provider, + boolean trackValue); - public T getCachedValue(@NotNull D dataHolder, - @NotNull CachedValueProvider provider) { - return getCachedValue(dataHolder, new MemoizationKey>(provider.getClass().getName()), provider, false); + public T getCachedValue(@NotNull D dataHolder, @NotNull CachedValueProvider provider) { + return getCachedValue(dataHolder, getKey(provider), provider, false); } - public static class MemoizationKey extends Key { - private final String myName; - - public MemoizationKey(@NotNull @NonNls String name) { - super(name); - myName = name; - } - - public int hashCode() { - return myName.hashCode(); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof MemoizationKey && myName.equals(((MemoizationKey)obj).myName); + private final ConcurrentMap> keyForProvider = new ConcurrentHashMap>(); + private Key> getKey(@NotNull CachedValueProvider provider) { + String name = provider.getClass().getName(); + Key key = keyForProvider.get(name); + if (key == null) { + key = ConcurrencyUtil.cacheOrGet(keyForProvider, name, Key.create(name)); } + return (Key)key; } - } diff --git a/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java b/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java index c92f03f502ee..b4329e2d7dd4 100644 --- a/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java +++ b/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java @@ -49,10 +49,9 @@ public class CachedValuesManagerImpl extends CachedValuesManager { @Override @Nullable public T getCachedValue(@NotNull D dataHolder, - @NotNull Key> key, - @NotNull CachedValueProvider provider, - boolean trackValue) { - + @NotNull Key> key, + @NotNull CachedValueProvider provider, + boolean trackValue) { CachedValue value; if (dataHolder instanceof UserDataHolderEx) { UserDataHolderEx dh = (UserDataHolderEx)dataHolder; diff --git a/platform/util/src/com/intellij/openapi/util/Key.java b/platform/util/src/com/intellij/openapi/util/Key.java index d33c3f6fcf0b..4412b3827be7 100644 --- a/platform/util/src/com/intellij/openapi/util/Key.java +++ b/platform/util/src/com/intellij/openapi/util/Key.java @@ -38,12 +38,12 @@ public class Key { myName = name; } - public int hashCode() { + public final int hashCode() { return myIndex; } @Override - public boolean equals(Object obj) { + public final boolean equals(Object obj) { return obj == this; } @@ -61,7 +61,7 @@ public class Key { } @Nullable - public T get(@Nullable Map holder) { + public T get(@Nullable Map holder) { return holder == null ? null : (T)holder.get(this); }