diff --git a/platform/core-api/src/com/intellij/psi/util/PsiCacheKey.java b/platform/core-api/src/com/intellij/psi/util/PsiCacheKey.java index 0154d9c12b84..1e21c807b195 100644 --- a/platform/core-api/src/com/intellij/psi/util/PsiCacheKey.java +++ b/platform/core-api/src/com/intellij/psi/util/PsiCacheKey.java @@ -21,14 +21,14 @@ package com.intellij.psi.util; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.UserDataHolderEx; import com.intellij.psi.PsiElement; +import com.intellij.reference.SoftReference; import com.intellij.util.Function; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class PsiCacheKey extends Key> { +public class PsiCacheKey extends Key>> { private final Function myFunction; private PsiCacheKey(@NonNls @NotNull String name, @NotNull Function function) { @@ -37,33 +37,22 @@ public class PsiCacheKey extends Key> { } public final T getValue(@NotNull H h) { - while (true) { - Pair data = h.getUserData(this); - - final long count = h.getManager().getModificationTracker().getJavaStructureModificationCount(); - if (data == null) { - data = new Pair(count, myFunction.fun(h)); - data = ((UserDataHolderEx)h).putUserDataIfAbsent(this, data); - } - else if (data.getFirst() != count) { - Pair newData = new Pair(count, myFunction.fun(h)); - if (((UserDataHolderEx)h).replace(this, data, newData)) { - data = newData; - } - else { - continue; - } - } - - return data.getSecond(); + T result = getCachedValueOrNull(h); + if (result != null) { + return result; } + + result = myFunction.fun(h); + final long count = h.getManager().getModificationTracker().getJavaStructureModificationCount(); + h.putUserData(this, new SoftReference>(new Pair(count, result))); + return result; } @Nullable public final T getCachedValueOrNull(@NotNull H h) { - Pair data = h.getUserData(this); - final long count = h.getManager().getModificationTracker().getJavaStructureModificationCount(); - if (data == null || data.getFirst() != count) { + SoftReference> ref = h.getUserData(this); + Pair data = ref == null ? null : ref.get(); + if (data == null || data.getFirst() != h.getManager().getModificationTracker().getJavaStructureModificationCount()) { return null; }