diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java b/platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java index 844d9bf389d2..07ca600789ed 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java @@ -74,7 +74,7 @@ public class ResolveCache { } private static ConcurrentWeakHashMap createWeakMap() { - return new ConcurrentWeakHashMap(100, 0.75f, Runtime.getRuntime().availableProcessors(), ContainerUtil.>canonicalStrategy()); + return new ConcurrentWeakHashMap(100, 0.75f, Runtime.getRuntime().availableProcessors(), ContainerUtil.canonicalStrategy()); } public void clearCache(boolean isPhysical) { diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentRefHashMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentRefHashMap.java index 074947dec4f2..d589a77341ad 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentRefHashMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentRefHashMap.java @@ -118,8 +118,8 @@ abstract class ConcurrentRefHashMap extends AbstractMap implements Con myMap = new ConcurrentHashMap, V>(); } - public ConcurrentRefHashMap(int initialCapacity, float loadFactor, int concurrencyLevel, TObjectHashingStrategy> hashingStrategy) { - myMap = new ConcurrentHashMap, V>(initialCapacity, loadFactor, concurrencyLevel, hashingStrategy); + public ConcurrentRefHashMap(int initialCapacity, float loadFactor, int concurrencyLevel, @NotNull TObjectHashingStrategy hashingStrategy) { + myMap = new ConcurrentHashMap, V>(initialCapacity, loadFactor, concurrencyLevel, ConcurrentRefHashMap.convertKToKeyK(hashingStrategy)); } public ConcurrentRefHashMap(Map t) { @@ -128,7 +128,12 @@ abstract class ConcurrentRefHashMap extends AbstractMap implements Con } public ConcurrentRefHashMap(@NotNull final TObjectHashingStrategy hashingStrategy) { - myMap = new ConcurrentHashMap, V>(new TObjectHashingStrategy>() { + myMap = new ConcurrentHashMap, V>(ConcurrentRefHashMap.convertKToKeyK(hashingStrategy)); + } + + @NotNull + private static TObjectHashingStrategy> convertKToKeyK(@NotNull final TObjectHashingStrategy hashingStrategy) { + return new TObjectHashingStrategy>() { @Override public int computeHashCode(final Key object) { return hashingStrategy.computeHashCode(object.get()); @@ -138,7 +143,7 @@ abstract class ConcurrentRefHashMap extends AbstractMap implements Con public boolean equals(final Key o1, final Key o2) { return hashingStrategy.equals(o1.get(), o2.get()); } - } ); + }; } diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentRefValueHashMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentRefValueHashMap.java index 7dd040ad1ff2..61a3556d4172 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentRefValueHashMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentRefValueHashMap.java @@ -16,39 +16,43 @@ package com.intellij.util.containers; +import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.lang.ref.ReferenceQueue; import java.util.*; import java.util.HashSet; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; abstract class ConcurrentRefValueHashMap implements ConcurrentMap { - private final ConcurrentHashMap> myMap; + private final ConcurrentHashMap> myMap; protected final ReferenceQueue myQueue = new ReferenceQueue(); - public ConcurrentRefValueHashMap(final Map map) { + public ConcurrentRefValueHashMap(@NotNull Map map) { this(); putAll(map); } public ConcurrentRefValueHashMap() { - myMap = new ConcurrentHashMap>(); + myMap = new ConcurrentHashMap>(); } public ConcurrentRefValueHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) { - myMap = new ConcurrentHashMap>(initialCapacity, loadFactor, concurrencyLevel); + myMap = new ConcurrentHashMap>(initialCapacity, loadFactor, concurrencyLevel); + } + public ConcurrentRefValueHashMap(int initialCapacity, float loadFactor, int concurrencyLevel, @NotNull TObjectHashingStrategy hashingStrategy) { + myMap = new ConcurrentHashMap>(initialCapacity, loadFactor, concurrencyLevel, hashingStrategy); } - protected interface MyReference { + protected interface MyValueReference { + @NotNull K getKey(); V get(); } private void processQueue() { while(true){ - MyReference ref = (MyReference)myQueue.poll(); + MyValueReference ref = (MyValueReference)myQueue.poll(); if (ref == null) break; myMap.remove(ref.getKey(), ref); } @@ -56,7 +60,7 @@ abstract class ConcurrentRefValueHashMap implements ConcurrentMap { @Override public V get(@NotNull Object key) { - MyReference ref = myMap.get(key); + MyValueReference ref = myMap.get(key); if (ref == null) return null; return ref.get(); } @@ -64,18 +68,18 @@ abstract class ConcurrentRefValueHashMap implements ConcurrentMap { @Override public V put(@NotNull K key, @NotNull V value) { processQueue(); - MyReference oldRef = myMap.put(key, createRef(key, value)); + MyValueReference oldRef = myMap.put(key, createRef(key, value)); return oldRef != null ? oldRef.get() : null; } - protected abstract MyReference createRef(K key, V value); + protected abstract MyValueReference createRef(@NotNull K key, @NotNull V value); @Override - public V putIfAbsent(@NotNull K key, V value) { - MyReference newRef = createRef(key, value); + public V putIfAbsent(@NotNull K key, @NotNull V value) { + MyValueReference newRef = createRef(key, value); while (true) { processQueue(); - MyReference oldRef = myMap.putIfAbsent(key, newRef); + MyValueReference oldRef = myMap.putIfAbsent(key, newRef); if (oldRef == null) return null; final V oldVal = oldRef.get(); if (oldVal == null) { @@ -88,7 +92,7 @@ abstract class ConcurrentRefValueHashMap implements ConcurrentMap { } @Override - public boolean remove(@NotNull final Object key, final Object value) { + public boolean remove(@NotNull final Object key, @NotNull Object value) { processQueue(); return myMap.remove(key, createRef((K)key, (V)value)); } @@ -102,19 +106,19 @@ abstract class ConcurrentRefValueHashMap implements ConcurrentMap { @Override public V replace(@NotNull final K key, @NotNull final V value) { processQueue(); - MyReference ref = myMap.replace(key, createRef(key, value)); + MyValueReference ref = myMap.replace(key, createRef(key, value)); return ref == null ? null : ref.get(); } @Override public V remove(Object key) { processQueue(); - MyReference ref = myMap.remove(key); - return ref != null ? ref.get() : null; + MyValueReference ref = myMap.remove(key); + return ref == null ? null : ref.get(); } @Override - public void putAll(Map t) { + public void putAll(@NotNull Map t) { processQueue(); for (K k : t.keySet()) { V v = t.get(k); @@ -150,16 +154,18 @@ abstract class ConcurrentRefValueHashMap implements ConcurrentMap { throw new RuntimeException("method not implemented"); } + @NotNull @Override public Set keySet() { return myMap.keySet(); } + @NotNull @Override public Collection values() { List result = new ArrayList(); - final Collection> refs = myMap.values(); - for (MyReference ref : refs) { + final Collection> refs = myMap.values(); + for (MyValueReference ref : refs) { final V value = ref.get(); if (value != null) { result.add(value); @@ -168,6 +174,7 @@ abstract class ConcurrentRefValueHashMap implements ConcurrentMap { return result; } + @NotNull @Override public Set> entrySet() { final Set keys = keySet(); diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentSoftHashMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentSoftHashMap.java index 6033447442ee..cd028d25e366 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentSoftHashMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentSoftHashMap.java @@ -79,7 +79,7 @@ public final class ConcurrentSoftHashMap extends ConcurrentRefHashMap public ConcurrentSoftHashMap(int initialCapacity, float loadFactor, int concurrencyLevel, - TObjectHashingStrategy> hashingStrategy) { + @NotNull TObjectHashingStrategy hashingStrategy) { super(initialCapacity, loadFactor, concurrencyLevel, hashingStrategy); } diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentSoftValueHashMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentSoftValueHashMap.java index 511bcf4fd605..f937a82e5fe0 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentSoftValueHashMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentSoftValueHashMap.java @@ -17,13 +17,15 @@ package com.intellij.util.containers; import com.intellij.openapi.util.Comparing; +import gnu.trove.TObjectHashingStrategy; +import org.jetbrains.annotations.NotNull; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.util.Map; public final class ConcurrentSoftValueHashMap extends ConcurrentRefValueHashMap { - public ConcurrentSoftValueHashMap(Map map) { + public ConcurrentSoftValueHashMap(@NotNull Map map) { super(map); } @@ -35,13 +37,18 @@ public final class ConcurrentSoftValueHashMap extends ConcurrentRefValueHas super(initialCapacity, loadFactor, concurrencyLevel); } - private static class MySoftReference extends SoftReference implements ConcurrentRefValueHashMap.MyReference { + public ConcurrentSoftValueHashMap(int initialCapacity, float loadFactor, int concurrencyLevel, @NotNull TObjectHashingStrategy hashingStrategy) { + super(initialCapacity, loadFactor, concurrencyLevel, hashingStrategy); + } + + private static class MySoftReference extends SoftReference implements MyValueReference { private final K key; - private MySoftReference(K key, T referent, ReferenceQueue q) { + private MySoftReference(@NotNull K key, @NotNull T referent, @NotNull ReferenceQueue q) { super(referent, q); this.key = key; } + @NotNull @Override public K getKey() { return key; @@ -52,7 +59,7 @@ public final class ConcurrentSoftValueHashMap extends ConcurrentRefValueHas if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - final ConcurrentRefValueHashMap.MyReference that = (ConcurrentRefValueHashMap.MyReference)o; + final MyValueReference that = (MyValueReference)o; return key.equals(that.getKey()) && Comparing.equal(get(), that.get()); } @@ -63,7 +70,7 @@ public final class ConcurrentSoftValueHashMap extends ConcurrentRefValueHas } @Override - protected ConcurrentRefValueHashMap.MyReference createRef(K key, V value) { + protected MyValueReference createRef(@NotNull K key, @NotNull V value) { return new MySoftReference(key, value, myQueue); } } diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentWeakHashMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentWeakHashMap.java index a1d148a04389..93cc863a107f 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentWeakHashMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentWeakHashMap.java @@ -82,7 +82,7 @@ public final class ConcurrentWeakHashMap extends ConcurrentRefHashMap public ConcurrentWeakHashMap(int initialCapacity, float loadFactor, int concurrencyLevel, - TObjectHashingStrategy> hashingStrategy) { + @NotNull TObjectHashingStrategy hashingStrategy) { super(initialCapacity, loadFactor, concurrencyLevel, hashingStrategy); } diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentWeakValueHashMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentWeakValueHashMap.java index c64f58f3f8c4..6efd6493fbd8 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentWeakValueHashMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentWeakValueHashMap.java @@ -17,13 +17,15 @@ package com.intellij.util.containers; import com.intellij.openapi.util.Comparing; +import gnu.trove.TObjectHashingStrategy; +import org.jetbrains.annotations.NotNull; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.Map; public final class ConcurrentWeakValueHashMap extends ConcurrentRefValueHashMap { - public ConcurrentWeakValueHashMap(Map map) { + public ConcurrentWeakValueHashMap(@NotNull Map map) { super(map); } @@ -35,13 +37,18 @@ public final class ConcurrentWeakValueHashMap extends ConcurrentRefValueHas super(initialCapacity, loadFactor, concurrencyLevel); } - private static class MyWeakReference extends WeakReference implements MyReference { + public ConcurrentWeakValueHashMap(int initialCapacity, float loadFactor, int concurrencyLevel, @NotNull TObjectHashingStrategy hashingStrategy) { + super(initialCapacity, loadFactor, concurrencyLevel, hashingStrategy); + } + + private static class MyWeakReference extends WeakReference implements MyValueReference { private final K key; - private MyWeakReference(K key, T referent, ReferenceQueue q) { + private MyWeakReference(@NotNull K key, @NotNull T referent, @NotNull ReferenceQueue q) { super(referent, q); this.key = key; } + @NotNull @Override public K getKey() { return key; @@ -52,7 +59,7 @@ public final class ConcurrentWeakValueHashMap extends ConcurrentRefValueHas if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - final MyReference that = (MyReference)o; + final MyValueReference that = (MyValueReference)o; return key.equals(that.getKey()) && Comparing.equal(get(), that.get()); } @@ -63,7 +70,7 @@ public final class ConcurrentWeakValueHashMap extends ConcurrentRefValueHas } @Override - protected MyReference createRef(K key, V value) { + protected MyValueReference createRef(@NotNull K key, @NotNull V value) { return new MyWeakReference(key, value, myQueue); } }