Weakly retained memoized functions moved out of util.runtime
This commit is contained in:
committed by
Alexander Udalov
parent
5ebbe0d772
commit
0765e89b19
+1
-3
@@ -25,8 +25,6 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
|||||||
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
|
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
|
||||||
import org.jetbrains.jet.storage.StorageManager;
|
import org.jetbrains.jet.storage.StorageManager;
|
||||||
|
|
||||||
import static org.jetbrains.jet.storage.StorageManager.ReferenceKind.STRONG;
|
|
||||||
|
|
||||||
public abstract class AbstractDescriptorFinder implements DescriptorFinder {
|
public abstract class AbstractDescriptorFinder implements DescriptorFinder {
|
||||||
|
|
||||||
private final MemoizedFunctionToNullable<ClassId, ClassDescriptor> findClass;
|
private final MemoizedFunctionToNullable<ClassId, ClassDescriptor> findClass;
|
||||||
@@ -52,7 +50,7 @@ public abstract class AbstractDescriptorFinder implements DescriptorFinder {
|
|||||||
classDescriptorCreated(classDescriptor);
|
classDescriptorCreated(classDescriptor);
|
||||||
return classDescriptor;
|
return classDescriptor;
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
+1
-3
@@ -37,8 +37,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.jet.storage.StorageManager.ReferenceKind.STRONG;
|
|
||||||
|
|
||||||
public class TypeDeserializer {
|
public class TypeDeserializer {
|
||||||
|
|
||||||
public interface TypeParameterResolver {
|
public interface TypeParameterResolver {
|
||||||
@@ -99,7 +97,7 @@ public class TypeDeserializer {
|
|||||||
public ClassDescriptor invoke(Integer fqNameIndex) {
|
public ClassDescriptor invoke(Integer fqNameIndex) {
|
||||||
return computeClassDescriptor(fqNameIndex);
|
return computeClassDescriptor(fqNameIndex);
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* package */ DescriptorFinder getDescriptorFinder() {
|
/* package */ DescriptorFinder getDescriptorFinder() {
|
||||||
|
|||||||
+1
-2
@@ -45,7 +45,6 @@ import java.util.*;
|
|||||||
import static org.jetbrains.jet.descriptors.serialization.TypeDeserializer.TypeParameterResolver.NONE;
|
import static org.jetbrains.jet.descriptors.serialization.TypeDeserializer.TypeParameterResolver.NONE;
|
||||||
import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER;
|
import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER;
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName;
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName;
|
||||||
import static org.jetbrains.jet.storage.StorageManager.ReferenceKind.STRONG;
|
|
||||||
|
|
||||||
public class DeserializedClassDescriptor extends AbstractClassDescriptor implements ClassDescriptor {
|
public class DeserializedClassDescriptor extends AbstractClassDescriptor implements ClassDescriptor {
|
||||||
|
|
||||||
@@ -497,7 +496,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
|
|||||||
descriptorFinder.findClass(classId.createNestedClassId(name)) :
|
descriptorFinder.findClass(classId.createNestedClassId(name)) :
|
||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
+2
-4
@@ -33,8 +33,6 @@ import org.jetbrains.jet.storage.StorageManager;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.jetbrains.jet.storage.StorageManager.ReferenceKind.STRONG;
|
|
||||||
|
|
||||||
public abstract class DeserializedMemberScope implements JetScope {
|
public abstract class DeserializedMemberScope implements JetScope {
|
||||||
|
|
||||||
private static final Filter<ProtoBuf.Callable.CallableKind> FUNCTION = new Filter<ProtoBuf.Callable.CallableKind>() {
|
private static final Filter<ProtoBuf.Callable.CallableKind> FUNCTION = new Filter<ProtoBuf.Callable.CallableKind>() {
|
||||||
@@ -78,13 +76,13 @@ public abstract class DeserializedMemberScope implements JetScope {
|
|||||||
public Collection<FunctionDescriptor> invoke(Name name) {
|
public Collection<FunctionDescriptor> invoke(Name name) {
|
||||||
return computeFunctions(name);
|
return computeFunctions(name);
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
this.properties = storageManager.createMemoizedFunction(new Function1<Name, Collection<VariableDescriptor>>() {
|
this.properties = storageManager.createMemoizedFunction(new Function1<Name, Collection<VariableDescriptor>>() {
|
||||||
@Override
|
@Override
|
||||||
public Collection<VariableDescriptor> invoke(Name name) {
|
public Collection<VariableDescriptor> invoke(Name name) {
|
||||||
return computeProperties(name);
|
return computeProperties(name);
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
this.allDescriptors = storageManager.createLazyValue(new Function0<Collection<DeclarationDescriptor>>() {
|
this.allDescriptors = storageManager.createLazyValue(new Function0<Collection<DeclarationDescriptor>>() {
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> invoke() {
|
public Collection<DeclarationDescriptor> invoke() {
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver.LookupMode;
|
import static org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver.LookupMode;
|
||||||
import static org.jetbrains.jet.storage.StorageManager.ReferenceKind.STRONG;
|
|
||||||
|
|
||||||
public class LazyImportScope implements JetScope {
|
public class LazyImportScope implements JetScope {
|
||||||
private final ResolveSession resolveSession;
|
private final ResolveSession resolveSession;
|
||||||
@@ -135,7 +134,7 @@ public class LazyImportScope implements JetScope {
|
|||||||
public ImportDirectiveResolveCache invoke(JetImportDirective directive) {
|
public ImportDirectiveResolveCache invoke(JetImportDirective directive) {
|
||||||
return new ImportDirectiveResolveCache(directive);
|
return new ImportDirectiveResolveCache(directive);
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
|
|
||||||
NamespaceDescriptor rootPackageDescriptor = resolveSession.getPackageDescriptorByFqName(FqName.ROOT);
|
NamespaceDescriptor rootPackageDescriptor = resolveSession.getPackageDescriptorByFqName(FqName.ROOT);
|
||||||
if (rootPackageDescriptor == null) {
|
if (rootPackageDescriptor == null) {
|
||||||
|
|||||||
@@ -36,8 +36,6 @@ import org.jetbrains.jet.storage.NotNullLazyValue;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.jet.storage.StorageManager.ReferenceKind.WEAK;
|
|
||||||
|
|
||||||
public class ScopeProvider {
|
public class ScopeProvider {
|
||||||
private final ResolveSession resolveSession;
|
private final ResolveSession resolveSession;
|
||||||
|
|
||||||
@@ -48,12 +46,12 @@ public class ScopeProvider {
|
|||||||
public ScopeProvider(@NotNull ResolveSession resolveSession) {
|
public ScopeProvider(@NotNull ResolveSession resolveSession) {
|
||||||
this.resolveSession = resolveSession;
|
this.resolveSession = resolveSession;
|
||||||
|
|
||||||
this.fileScopes = resolveSession.getStorageManager().createMemoizedFunction(new Function1<JetFile, JetScope>() {
|
this.fileScopes = resolveSession.getStorageManager().createWeaklyRetainedMemoizedFunction(new Function1<JetFile, JetScope>() {
|
||||||
@Override
|
@Override
|
||||||
public JetScope invoke(@NotNull JetFile file) {
|
public JetScope invoke(@NotNull JetFile file) {
|
||||||
return createFileScope(file);
|
return createFileScope(file);
|
||||||
}
|
}
|
||||||
}, WEAK);
|
});
|
||||||
|
|
||||||
this.defaultImportsScope = resolveSession.getStorageManager().createLazyValue(new Function0<JetScope>() {
|
this.defaultImportsScope = resolveSession.getStorageManager().createLazyValue(new Function0<JetScope>() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+1
-1
@@ -76,7 +76,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
|
|||||||
public PackageMemberDeclarationProvider invoke(FqName fqName) {
|
public PackageMemberDeclarationProvider invoke(FqName fqName) {
|
||||||
return createPackageMemberDeclarationProvider(fqName);
|
return createPackageMemberDeclarationProvider(fqName);
|
||||||
}
|
}
|
||||||
}, StorageManager.ReferenceKind.STRONG);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
+4
-5
@@ -42,7 +42,6 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve;
|
import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve;
|
||||||
import static org.jetbrains.jet.storage.StorageManager.ReferenceKind.STRONG;
|
|
||||||
|
|
||||||
public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, DP extends DeclarationProvider> implements JetScope {
|
public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, DP extends DeclarationProvider> implements JetScope {
|
||||||
protected final ResolveSession resolveSession;
|
protected final ResolveSession resolveSession;
|
||||||
@@ -77,26 +76,26 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
|
|||||||
public List<ClassDescriptor> invoke(Name name) {
|
public List<ClassDescriptor> invoke(Name name) {
|
||||||
return resolveClassOrObjectDescriptor(name, false);
|
return resolveClassOrObjectDescriptor(name, false);
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
this.objectDescriptors = storageManager.createMemoizedFunction(new Function1<Name, List<ClassDescriptor>>() {
|
this.objectDescriptors = storageManager.createMemoizedFunction(new Function1<Name, List<ClassDescriptor>>() {
|
||||||
@Override
|
@Override
|
||||||
public List<ClassDescriptor> invoke(Name name) {
|
public List<ClassDescriptor> invoke(Name name) {
|
||||||
return resolveClassOrObjectDescriptor(name, true);
|
return resolveClassOrObjectDescriptor(name, true);
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
|
|
||||||
this.functionDescriptors = storageManager.createMemoizedFunction(new Function1<Name, Set<FunctionDescriptor>>() {
|
this.functionDescriptors = storageManager.createMemoizedFunction(new Function1<Name, Set<FunctionDescriptor>>() {
|
||||||
@Override
|
@Override
|
||||||
public Set<FunctionDescriptor> invoke(Name name) {
|
public Set<FunctionDescriptor> invoke(Name name) {
|
||||||
return doGetFunctions(name);
|
return doGetFunctions(name);
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
this.propertyDescriptors = storageManager.createMemoizedFunction(new Function1<Name, Set<VariableDescriptor>>() {
|
this.propertyDescriptors = storageManager.createMemoizedFunction(new Function1<Name, Set<VariableDescriptor>>() {
|
||||||
@Override
|
@Override
|
||||||
public Set<VariableDescriptor> invoke(Name name) {
|
public Set<VariableDescriptor> invoke(Name name) {
|
||||||
return doGetProperties(name);
|
return doGetProperties(name);
|
||||||
}
|
}
|
||||||
}, STRONG);
|
});
|
||||||
|
|
||||||
this.allDescriptors = storageManager.createLazyValue(new Function0<AllDescriptors>() {
|
this.allDescriptors = storageManager.createLazyValue(new Function0<AllDescriptors>() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+1
-2
@@ -29,7 +29,6 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
|
|||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
|
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
|
||||||
import org.jetbrains.jet.storage.StorageManager;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -49,7 +48,7 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<NamespaceDes
|
|||||||
public NamespaceDescriptor invoke(Name name) {
|
public NamespaceDescriptor invoke(Name name) {
|
||||||
return createPackageDescriptor(name);
|
return createPackageDescriptor(name);
|
||||||
}
|
}
|
||||||
}, StorageManager.ReferenceKind.STRONG);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+9
@@ -16,11 +16,20 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.resolve.lazy.storage;
|
package org.jetbrains.jet.lang.resolve.lazy.storage;
|
||||||
|
|
||||||
|
import jet.Function1;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||||
|
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
|
||||||
|
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
|
||||||
import org.jetbrains.jet.storage.StorageManager;
|
import org.jetbrains.jet.storage.StorageManager;
|
||||||
|
|
||||||
public interface LazyResolveStorageManager extends StorageManager {
|
public interface LazyResolveStorageManager extends StorageManager {
|
||||||
|
@NotNull
|
||||||
|
<K, V> MemoizedFunctionToNotNull<K, V> createWeaklyRetainedMemoizedFunction(@NotNull Function1<K, V> compute);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
<K, V> MemoizedFunctionToNullable<K, V> createWeaklyRetainedMemoizedFunctionWithNullableValues(@NotNull Function1<K, V> compute);
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
BindingTrace createSafeTrace(@NotNull BindingTrace originalTrace);
|
BindingTrace createSafeTrace(@NotNull BindingTrace originalTrace);
|
||||||
}
|
}
|
||||||
|
|||||||
+21
@@ -17,6 +17,8 @@
|
|||||||
package org.jetbrains.jet.lang.resolve.lazy.storage;
|
package org.jetbrains.jet.lang.resolve.lazy.storage;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.intellij.util.containers.ConcurrentWeakValueHashMap;
|
||||||
|
import jet.Function1;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.annotations.TestOnly;
|
import org.jetbrains.annotations.TestOnly;
|
||||||
@@ -25,6 +27,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
|
|||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.Diagnostics;
|
import org.jetbrains.jet.lang.resolve.Diagnostics;
|
||||||
import org.jetbrains.jet.storage.LockBasedStorageManager;
|
import org.jetbrains.jet.storage.LockBasedStorageManager;
|
||||||
|
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
|
||||||
|
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
|
||||||
import org.jetbrains.jet.util.slicedmap.ReadOnlySlice;
|
import org.jetbrains.jet.util.slicedmap.ReadOnlySlice;
|
||||||
import org.jetbrains.jet.util.slicedmap.WritableSlice;
|
import org.jetbrains.jet.util.slicedmap.WritableSlice;
|
||||||
|
|
||||||
@@ -32,6 +36,23 @@ import java.util.Collection;
|
|||||||
import java.util.concurrent.locks.Lock;
|
import java.util.concurrent.locks.Lock;
|
||||||
|
|
||||||
public class LockBasedLazyResolveStorageManager extends LockBasedStorageManager implements LazyResolveStorageManager {
|
public class LockBasedLazyResolveStorageManager extends LockBasedStorageManager implements LazyResolveStorageManager {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public <K, V> MemoizedFunctionToNotNull<K, V> createWeaklyRetainedMemoizedFunction(
|
||||||
|
@NotNull Function1<K, V> compute
|
||||||
|
) {
|
||||||
|
return super.createMemoizedFunction(compute, new ConcurrentWeakValueHashMap<K, Object>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public <K, V> MemoizedFunctionToNullable<K, V> createWeaklyRetainedMemoizedFunctionWithNullableValues(
|
||||||
|
@NotNull Function1<K, V> compute
|
||||||
|
) {
|
||||||
|
return super.createMemoizedFunctionWithNullableValues(compute, new ConcurrentWeakValueHashMap<K, Object>());
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public BindingTrace createSafeTrace(@NotNull BindingTrace originalTrace) {
|
public BindingTrace createSafeTrace(@NotNull BindingTrace originalTrace) {
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ import java.util.Arrays;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.jet.storage.StorageManager.ReferenceKind.STRONG;
|
|
||||||
|
|
||||||
public class StorageManagerTest extends TestCase {
|
public class StorageManagerTest extends TestCase {
|
||||||
|
|
||||||
private StorageManager m;
|
private StorageManager m;
|
||||||
@@ -102,31 +100,31 @@ public class StorageManagerTest extends TestCase {
|
|||||||
|
|
||||||
public void testFunctionComputesOnce() throws Exception {
|
public void testFunctionComputesOnce() throws Exception {
|
||||||
CounterFunction counter = new CounterFunction();
|
CounterFunction counter = new CounterFunction();
|
||||||
MemoizedFunctionToNotNull<String, String> f = m.createMemoizedFunction(counter, STRONG);
|
MemoizedFunctionToNotNull<String, String> f = m.createMemoizedFunction(counter);
|
||||||
doTestComputesOnce(apply(f, "ok"), "ok1", counter);
|
doTestComputesOnce(apply(f, "ok"), "ok1", counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNullableFunctionComputesOnce() throws Exception {
|
public void testNullableFunctionComputesOnce() throws Exception {
|
||||||
CounterFunction counter = new CounterFunction();
|
CounterFunction counter = new CounterFunction();
|
||||||
MemoizedFunctionToNullable<String, String> f = m.createMemoizedFunctionWithNullableValues(counter, STRONG);
|
MemoizedFunctionToNullable<String, String> f = m.createMemoizedFunctionWithNullableValues(counter);
|
||||||
doTestComputesOnce(apply(f, "ok"), "ok1", counter);
|
doTestComputesOnce(apply(f, "ok"), "ok1", counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNullIsNotConfusedForNotComputedInFunction() throws Exception {
|
public void testNullIsNotConfusedForNotComputedInFunction() throws Exception {
|
||||||
CounterFunctionToNull counter = new CounterFunctionToNull();
|
CounterFunctionToNull counter = new CounterFunctionToNull();
|
||||||
MemoizedFunctionToNullable<String, String> f = m.createMemoizedFunctionWithNullableValues(counter, STRONG);
|
MemoizedFunctionToNullable<String, String> f = m.createMemoizedFunctionWithNullableValues(counter);
|
||||||
doTestComputesOnce(apply(f, ""), null, counter);
|
doTestComputesOnce(apply(f, ""), null, counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testFunctionPreservesExceptions() throws Exception {
|
public void testFunctionPreservesExceptions() throws Exception {
|
||||||
ExceptionCounterFunction counter = new ExceptionCounterFunction();
|
ExceptionCounterFunction counter = new ExceptionCounterFunction();
|
||||||
MemoizedFunctionToNotNull<String, String> f = m.createMemoizedFunction(counter, STRONG);
|
MemoizedFunctionToNotNull<String, String> f = m.createMemoizedFunction(counter);
|
||||||
doTestExceptionPreserved(apply(f, ""), UnsupportedOperationException.class, counter);
|
doTestExceptionPreserved(apply(f, ""), UnsupportedOperationException.class, counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNullableFunctionPreservesExceptions() throws Exception {
|
public void testNullableFunctionPreservesExceptions() throws Exception {
|
||||||
ExceptionCounterFunction counter = new ExceptionCounterFunction();
|
ExceptionCounterFunction counter = new ExceptionCounterFunction();
|
||||||
MemoizedFunctionToNullable<String, String> f = m.createMemoizedFunctionWithNullableValues(counter, STRONG);
|
MemoizedFunctionToNullable<String, String> f = m.createMemoizedFunctionWithNullableValues(counter);
|
||||||
doTestExceptionPreserved(apply(f, ""), UnsupportedOperationException.class, counter);
|
doTestExceptionPreserved(apply(f, ""), UnsupportedOperationException.class, counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -42,7 +42,6 @@ import org.jetbrains.jet.lang.resolve.name.Name;
|
|||||||
import org.jetbrains.jet.lang.types.ErrorUtils;
|
import org.jetbrains.jet.lang.types.ErrorUtils;
|
||||||
import org.jetbrains.jet.storage.LockBasedStorageManager;
|
import org.jetbrains.jet.storage.LockBasedStorageManager;
|
||||||
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
|
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
|
||||||
import org.jetbrains.jet.storage.StorageManager;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -75,7 +74,7 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer
|
|||||||
return Collections.emptyMap();
|
return Collections.emptyMap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, StorageManager.ReferenceKind.STRONG);
|
});
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setJavaClassResolver(JavaClassResolver javaClassResolver) {
|
public void setJavaClassResolver(JavaClassResolver javaClassResolver) {
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.storage;
|
package org.jetbrains.jet.storage;
|
||||||
|
|
||||||
import com.intellij.util.containers.ConcurrentWeakValueHashMap;
|
|
||||||
import jet.Function0;
|
import jet.Function0;
|
||||||
import jet.Function1;
|
import jet.Function1;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -50,24 +49,30 @@ public class LockBasedStorageManager implements StorageManager {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public <K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction(
|
public <K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction(@NotNull Function1<K, V> compute) {
|
||||||
@NotNull Function1<K, V> compute, @NotNull ReferenceKind valuesReferenceKind
|
return createMemoizedFunction(compute, new ConcurrentHashMap<K, Object>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
protected <K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction(
|
||||||
|
@NotNull Function1<K, V> compute,
|
||||||
|
@NotNull ConcurrentMap<K, Object> map
|
||||||
) {
|
) {
|
||||||
ConcurrentMap<K, Object> map = createConcurrentMap(valuesReferenceKind);
|
|
||||||
return new MapBasedMemoizedFunctionToNotNull<K, V>(lock, map, compute);
|
return new MapBasedMemoizedFunctionToNotNull<K, V>(lock, map, compute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public <K, V> MemoizedFunctionToNullable<K, V> createMemoizedFunctionWithNullableValues(
|
public <K, V> MemoizedFunctionToNullable<K, V> createMemoizedFunctionWithNullableValues(@NotNull Function1<K, V> compute) {
|
||||||
@NotNull Function1<K, V> compute, @NotNull ReferenceKind valuesReferenceKind
|
return createMemoizedFunctionWithNullableValues(compute, new ConcurrentHashMap<K, Object>());
|
||||||
) {
|
|
||||||
ConcurrentMap<K, Object> map = createConcurrentMap(valuesReferenceKind);
|
|
||||||
return new MapBasedMemoizedFunction<K, V>(lock, map, compute);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <K, V> ConcurrentMap<K, V> createConcurrentMap(ReferenceKind referenceKind) {
|
@NotNull
|
||||||
return (referenceKind == ReferenceKind.WEAK) ? new ConcurrentWeakValueHashMap<K, V>() : new ConcurrentHashMap<K, V>();
|
protected <K, V> MemoizedFunctionToNullable<K, V> createMemoizedFunctionWithNullableValues(
|
||||||
|
@NotNull Function1<K, V> compute,
|
||||||
|
@NotNull ConcurrentMap<K, Object> map
|
||||||
|
) {
|
||||||
|
return new MapBasedMemoizedFunction<K, V>(lock, map, compute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -30,9 +30,9 @@ public interface StorageManager {
|
|||||||
* NOTE: if compute() has side-effects the WEAK reference kind is dangerous: the side-effects will be repeated if
|
* NOTE: if compute() has side-effects the WEAK reference kind is dangerous: the side-effects will be repeated if
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
<K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction(@NotNull Function1<K, V> compute, @NotNull ReferenceKind valuesReferenceKind);
|
<K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction(@NotNull Function1<K, V> compute);
|
||||||
@NotNull
|
@NotNull
|
||||||
<K, V> MemoizedFunctionToNullable<K, V> createMemoizedFunctionWithNullableValues(@NotNull Function1<K, V> compute, @NotNull ReferenceKind valuesReferenceKind);
|
<K, V> MemoizedFunctionToNullable<K, V> createMemoizedFunctionWithNullableValues(@NotNull Function1<K, V> compute);
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
<T> NotNullLazyValue<T> createLazyValue(@NotNull Function0<T> computable);
|
<T> NotNullLazyValue<T> createLazyValue(@NotNull Function0<T> computable);
|
||||||
@@ -69,9 +69,4 @@ public interface StorageManager {
|
|||||||
<T> NullableLazyValue<T> createNullableLazyValueWithPostCompute(@NotNull Function0<T> computable, @NotNull Function1<T, Void> postCompute);
|
<T> NullableLazyValue<T> createNullableLazyValueWithPostCompute(@NotNull Function0<T> computable, @NotNull Function1<T, Void> postCompute);
|
||||||
|
|
||||||
<T> T compute(@NotNull Function0<T> computable);
|
<T> T compute(@NotNull Function0<T> computable);
|
||||||
|
|
||||||
enum ReferenceKind {
|
|
||||||
STRONG,
|
|
||||||
WEAK
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,13 +39,13 @@ import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
|
|||||||
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider;
|
import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider;
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor;
|
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyPackageDescriptor;
|
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyPackageDescriptor;
|
||||||
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
|
import org.jetbrains.jet.lang.resolve.lazy.storage.LazyResolveStorageManager;
|
||||||
import org.jetbrains.jet.storage.StorageManager;
|
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
||||||
import org.jetbrains.jet.lang.types.TypeConstructor;
|
import org.jetbrains.jet.lang.types.TypeConstructor;
|
||||||
|
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -66,14 +66,14 @@ public class ResolveElementCache {
|
|||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Result<MemoizedFunctionToNotNull<JetElement, BindingContext>> compute() {
|
public Result<MemoizedFunctionToNotNull<JetElement, BindingContext>> compute() {
|
||||||
StorageManager manager = ResolveElementCache.this.resolveSession.getStorageManager();
|
LazyResolveStorageManager manager = ResolveElementCache.this.resolveSession.getStorageManager();
|
||||||
MemoizedFunctionToNotNull<JetElement, BindingContext> elementsCacheFunction =
|
MemoizedFunctionToNotNull<JetElement, BindingContext> elementsCacheFunction =
|
||||||
manager.createMemoizedFunction(new Function1<JetElement, BindingContext>() {
|
manager.createWeaklyRetainedMemoizedFunction(new Function1<JetElement, BindingContext>() {
|
||||||
@Override
|
@Override
|
||||||
public BindingContext invoke(JetElement jetElement) {
|
public BindingContext invoke(JetElement jetElement) {
|
||||||
return elementAdditionalResolve(jetElement);
|
return elementAdditionalResolve(jetElement);
|
||||||
}
|
}
|
||||||
}, StorageManager.ReferenceKind.WEAK);
|
});
|
||||||
|
|
||||||
return Result.create(elementsCacheFunction, PsiModificationTracker.MODIFICATION_COUNT);
|
return Result.create(elementsCacheFunction, PsiModificationTracker.MODIFICATION_COUNT);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user