Getting rid of Computable and Function in lazy values and memoized functions

This commit is contained in:
Andrey Breslav
2013-10-04 19:17:10 +04:00
committed by Alexander Udalov
parent 4d28dfada6
commit 7d1c46ed2c
27 changed files with 103 additions and 131 deletions
@@ -58,7 +58,7 @@ public abstract class AbstractDescriptorFinder implements DescriptorFinder {
@Nullable
@Override
public ClassDescriptor findClass(@NotNull ClassId classId) {
return findClass.fun(classId);
return findClass.invoke(classId);
}
@Nullable
@@ -136,7 +136,7 @@ public class TypeDeserializer {
private TypeConstructor typeConstructor(@NotNull ProtoBuf.Type.Constructor proto) {
switch (proto.getKind()) {
case CLASS:
ClassDescriptor classDescriptor = classDescriptors.fun(proto.getId());
ClassDescriptor classDescriptor = classDescriptors.invoke(proto.getId());
if (classDescriptor == null) return null;
return classDescriptor.getTypeConstructor();
@@ -227,7 +227,7 @@ public class TypeDeserializer {
@NotNull
@Override
public TypeConstructor getConstructor() {
return constructor.compute();
return constructor.invoke();
}
@NotNull
@@ -254,7 +254,7 @@ public class TypeDeserializer {
@NotNull
@Override
public JetScope getMemberScope() {
return memberScope.compute();
return memberScope.invoke();
}
@Override
@@ -151,7 +151,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@NotNull
@Override
public DeclarationDescriptor getContainingDeclaration() {
return containingDeclaration.compute();
return containingDeclaration.invoke();
}
@NotNull
@@ -201,7 +201,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@Override
public List<AnnotationDescriptor> getAnnotations() {
return annotations.compute();
return annotations.invoke();
}
@Override
@@ -226,7 +226,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@Nullable
@Override
public ConstructorDescriptor getUnsubstitutedPrimaryConstructor() {
return primaryConstructor.compute();
return primaryConstructor.invoke();
}
@NotNull
@@ -306,7 +306,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@Nullable
@Override
public ClassDescriptor getClassObjectDescriptor() {
return classObjectDescriptor.compute();
return classObjectDescriptor.invoke();
}
@NotNull
@@ -463,7 +463,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@Nullable
@Override
protected ClassifierDescriptor getClassDescriptor(@NotNull Name name) {
return classDescriptor.nestedClasses.findClass.fun(name);
return classDescriptor.nestedClasses.findClass.invoke(name);
}
@Override
@@ -474,7 +474,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@Nullable
@Override
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
return classDescriptor.nestedObjects.findClass.fun(name);
return classDescriptor.nestedObjects.findClass.invoke(name);
}
@NotNull
@@ -504,7 +504,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
public Collection<ClassDescriptor> getAllDescriptors() {
Collection<ClassDescriptor> result = new ArrayList<ClassDescriptor>(declaredNames.size());
for (Name name : declaredNames) {
ClassDescriptor descriptor = findClass.fun(name);
ClassDescriptor descriptor = findClass.invoke(name);
if (descriptor != null) {
result.add(descriptor);
}
@@ -143,7 +143,7 @@ public abstract class DeserializedMemberScope implements JetScope {
@NotNull
@Override
public final Collection<FunctionDescriptor> getFunctions(@NotNull Name name) {
return functions.fun(name);
return functions.invoke(name);
}
@NotNull
@@ -160,7 +160,7 @@ public abstract class DeserializedMemberScope implements JetScope {
@NotNull
@Override
public Collection<VariableDescriptor> getProperties(@NotNull Name name) {
return properties.fun(name);
return properties.invoke(name);
}
@Nullable
@@ -184,7 +184,7 @@ public abstract class DeserializedMemberScope implements JetScope {
@NotNull
@Override
public Collection<ClassDescriptor> getObjectDescriptors() {
return objectDescriptors.compute();
return objectDescriptors.invoke();
}
@Nullable
@@ -231,7 +231,7 @@ public abstract class DeserializedMemberScope implements JetScope {
@NotNull
@Override
public final Collection<DeclarationDescriptor> getAllDescriptors() {
return allDescriptors.compute();
return allDescriptors.invoke();
}
@NotNull
@@ -45,7 +45,7 @@ class ImportsProvider {
@NotNull
public List<JetImportDirective> getImports(@NotNull Name name) {
return importsCacheValue.compute().getImports(name);
return importsCacheValue.invoke().getImports(name);
}
@NotNull
@@ -234,7 +234,7 @@ public class LazyImportScope implements JetScope {
@NotNull
private JetScope getImportScope(JetImportDirective directive, LookupMode lookupMode) {
return importedScopesProvider.fun(directive).scopeForMode(lookupMode);
return importedScopesProvider.invoke(directive).scopeForMode(lookupMode);
}
@Nullable
@@ -65,7 +65,7 @@ public class ScopeProvider {
@NotNull
public JetScope getFileScope(JetFile file) {
return fileScopes.fun(file);
return fileScopes.invoke(file);
}
private JetScope createFileScope(JetFile file) {
@@ -88,7 +88,7 @@ public class ScopeProvider {
packageDescriptor.getMemberScope(),
rootPackageDescriptor.getMemberScope(),
importsScope,
defaultImportsScope.compute());
defaultImportsScope.invoke());
}
private JetScope createScopeWithDefaultImports() {
@@ -106,7 +106,7 @@ public class FilteringClassLikeInfo implements JetClassLikeInfo {
@Override
@NotNull
public List<JetDeclaration> getDeclarations() {
return filteredDeclarations.compute();
return filteredDeclarations.invoke();
}
@Override
@@ -84,24 +84,24 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
@Override
public List<JetDeclaration> getAllDeclarations() {
return index.compute().allDeclarations;
return index.invoke().allDeclarations;
}
@NotNull
@Override
public List<JetNamedFunction> getFunctionDeclarations(@NotNull Name name) {
return Lists.newArrayList(index.compute().functions.get(name));
return Lists.newArrayList(index.invoke().functions.get(name));
}
@NotNull
@Override
public List<JetProperty> getPropertyDeclarations(@NotNull Name name) {
return Lists.newArrayList(index.compute().properties.get(name));
return Lists.newArrayList(index.invoke().properties.get(name));
}
@NotNull
@Override
public Collection<JetClassOrObject> getClassOrObjectDeclarations(@NotNull Name name) {
return index.compute().classesAndObjects.get(name);
return index.invoke().classesAndObjects.get(name);
}
}
@@ -102,7 +102,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
}
/*package*/ boolean isPackageDeclaredExplicitly(@NotNull FqName packageFqName) {
return index.compute().declaredPackages.contains(packageFqName);
return index.invoke().declaredPackages.contains(packageFqName);
}
/*package*/ boolean isPackageDeclared(@NotNull FqName packageFqName) {
@@ -110,7 +110,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
}
/*package*/ Collection<FqName> getAllDeclaredSubPackagesOf(@NotNull final FqName parent) {
return Collections2.filter(index.compute().declaredPackages, new Predicate<FqName>() {
return Collections2.filter(index.invoke().declaredPackages, new Predicate<FqName>() {
@Override
public boolean apply(FqName fqName) {
return !fqName.isRoot() && fqName.parent().equals(parent);
@@ -124,9 +124,9 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
}
Collection<NavigatablePsiElement> resultElements = Lists.newArrayList();
for (FqName declaredPackage : index.compute().filesByPackage.keys()) {
for (FqName declaredPackage : index.invoke().filesByPackage.keys()) {
if (QualifiedNamesUtil.isSubpackageOf(declaredPackage, fqName)) {
Collection<JetFile> files = index.compute().filesByPackage.get(declaredPackage);
Collection<JetFile> files = index.invoke().filesByPackage.get(declaredPackage);
resultElements.addAll(ContainerUtil.map(files, new Function<JetFile, NavigatablePsiElement>() {
@Override
public NavigatablePsiElement fun(JetFile file) {
@@ -141,7 +141,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
@Override
public PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName) {
return packageDeclarationProviders.fun(packageFqName);
return packageDeclarationProviders.invoke(packageFqName);
}
@Nullable
@@ -153,13 +153,13 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF
return null;
}
return new FileBasedPackageMemberDeclarationProvider(storageManager, packageFqName, this, index.compute().filesByPackage.get(packageFqName));
return new FileBasedPackageMemberDeclarationProvider(storageManager, packageFqName, this, index.invoke().filesByPackage.get(packageFqName));
}
@NotNull
@Override
public ClassMemberDeclarationProvider getClassMemberDeclarationProvider(@NotNull JetClassLikeInfo classLikeInfo) {
if (!index.compute().filesByPackage.containsKey(classLikeInfo.getContainingPackageFqName())) {
if (!index.invoke().filesByPackage.containsKey(classLikeInfo.getContainingPackageFqName())) {
throw new IllegalStateException("This factory doesn't know about this class: " + classLikeInfo);
}
@@ -71,7 +71,7 @@ public class FileBasedPackageMemberDeclarationProvider extends AbstractPsiBasedD
@Override
public Collection<FqName> getAllDeclaredPackages() {
return allDeclaredPackages.compute();
return allDeclaredPackages.invoke();
}
@NotNull
@@ -126,12 +126,12 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@Override
public ClassifierDescriptor getClassifier(@NotNull Name name) {
return first(classDescriptors.fun(name));
return first(classDescriptors.invoke(name));
}
@Override
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
return first(objectDescriptors.fun(name));
return first(objectDescriptors.invoke(name));
}
private static <T> T first(@NotNull List<T> list) {
@@ -142,7 +142,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@NotNull
@Override
public Set<FunctionDescriptor> getFunctions(@NotNull Name name) {
return functionDescriptors.fun(name);
return functionDescriptors.invoke(name);
}
@NotNull
@@ -175,7 +175,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@NotNull
@Override
public Set<VariableDescriptor> getProperties(@NotNull Name name) {
return propertyDescriptors.fun(name);
return propertyDescriptors.invoke(name);
}
@NotNull
@@ -224,7 +224,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@NotNull
@Override
public Collection<ClassDescriptor> getObjectDescriptors() {
return allDescriptors.compute().objects;
return allDescriptors.invoke().objects;
}
@Override
@@ -248,7 +248,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
@NotNull
@Override
public Collection<DeclarationDescriptor> getAllDescriptors() {
return allDescriptors.compute().all;
return allDescriptors.invoke().all;
}
@NotNull
@@ -275,7 +275,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
JetClassOrObject classOrObject = (JetClassOrObject) declaration;
Name name = safeNameForLazyResolve(classOrObject.getNameAsName());
if (name != null) {
result.all.addAll(classDescriptors.fun(name));
result.all.addAll(classDescriptors.invoke(name));
}
}
else if (declaration instanceof JetFunction) {
@@ -175,7 +175,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
@NotNull
public JetScope getScopeForClassHeaderResolution() {
return scopeForClassHeaderResolution.compute();
return scopeForClassHeaderResolution.invoke();
}
@NotNull
@@ -195,7 +195,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
@NotNull
public JetScope getScopeForMemberDeclarationResolution() {
return scopeForMemberDeclarationResolution.compute();
return scopeForMemberDeclarationResolution.invoke();
}
@NotNull
@@ -218,7 +218,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
@NotNull
public JetScope getScopeForPropertyInitializerResolution() {
return scopeForPropertyInitializerResolution.compute();
return scopeForPropertyInitializerResolution.invoke();
}
@NotNull
@@ -263,7 +263,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
@Override
public ClassDescriptor getClassObjectDescriptor() {
return classObjectDescriptor.compute();
return classObjectDescriptor.invoke();
}
@Nullable
@@ -323,12 +323,12 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
@NotNull
@Override
public ReceiverParameterDescriptor getThisAsReceiverParameter() {
return thisAsReceiverParameter.compute();
return thisAsReceiverParameter.invoke();
}
@Override
public List<AnnotationDescriptor> getAnnotations() {
return annotations.compute();
return annotations.invoke();
}
@NotNull
@@ -427,13 +427,13 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
@NotNull
@Override
public List<TypeParameterDescriptor> getParameters() {
return parameters.compute();
return parameters.invoke();
}
@NotNull
@Override
public Collection<JetType> getSupertypes() {
return supertypes.compute();
return supertypes.invoke();
}
private void findAndDisconnectLoopsInTypeHierarchy(Collection<JetType> supertypes) {
@@ -348,7 +348,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
@Nullable
public ConstructorDescriptor getPrimaryConstructor() {
return primaryConstructor.compute();
return primaryConstructor.invoke();
}
@Nullable
@@ -54,7 +54,7 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<NamespaceDes
@Override
public NamespaceDescriptor getNamespace(@NotNull Name name) {
return packageDescriptors.fun(name);
return packageDescriptors.invoke(name);
}
@Nullable
@@ -54,7 +54,7 @@ public class DeferredType implements JetType {
@NotNull
public JetType getActualType() {
return lazyValue.compute();
return lazyValue.invoke();
}
@Override
@@ -3,6 +3,8 @@ package org.jetbrains.jet.storage;
import com.intellij.openapi.util.Computable;
import com.intellij.util.Consumer;
import com.intellij.util.Function;
import jet.Function0;
import jet.Function1;
import junit.framework.TestCase;
import java.util.ArrayList;
@@ -22,23 +24,23 @@ public class StorageManagerTest extends TestCase {
m = new LockBasedStorageManager();
}
public static <T> void doTestComputesOnce(Computable<T> v, T expected, Counter counter) throws Exception {
public static <T> void doTestComputesOnce(Function0<T> v, T expected, Counter counter) throws Exception {
assert 0 == counter.getCount();
T result1 = v.compute();
T result2 = v.compute();
T result1 = v.invoke();
T result2 = v.invoke();
assertEquals(1, counter.getCount());
assertEquals(expected, result1);
assertEquals(result1, result2);
}
public static <T> void doTestExceptionPreserved(Computable<T> v, Class<? extends Throwable> expected, Counter counter)
public static <T> void doTestExceptionPreserved(Function0<T> v, Class<? extends Throwable> expected, Counter counter)
throws Exception {
assert 0 == counter.getCount();
Throwable caught1 = null;
try {
v.compute();
v.invoke();
fail();
}
catch (Throwable e) {
@@ -46,7 +48,7 @@ public class StorageManagerTest extends TestCase {
}
Throwable caught2 = null;
try {
v.compute();
v.invoke();
fail();
}
catch (Throwable e) {
@@ -64,14 +66,14 @@ public class StorageManagerTest extends TestCase {
public void testIsComputed() throws Exception {
NotNullLazyValue<String> value = m.createLazyValue(new CounterValue());
assertFalse(value.isComputed());
value.compute();
value.invoke();
assertTrue(value.isComputed());
}
public void testIsNullableComputed() throws Exception {
NullableLazyValue<String> value = m.createNullableLazyValue(new CounterValueNull());
assertFalse(value.isComputed());
value.compute();
value.invoke();
assertTrue(value.isComputed());
}
@@ -80,7 +82,7 @@ public class StorageManagerTest extends TestCase {
assertFalse(value.isComputed());
try {
value.compute();
value.invoke();
}
catch (Exception ignored) {
}
@@ -93,7 +95,7 @@ public class StorageManagerTest extends TestCase {
assertFalse(value.isComputed());
try {
value.compute();
value.invoke();
}
catch (Exception ignored) {
}
@@ -168,13 +170,13 @@ public class StorageManagerTest extends TestCase {
NotNullLazyValue<String> rec = m.createLazyValue(new Computable<String>() {
@Override
public String compute() {
return rec.compute();
return rec.invoke();
}
});
}
try {
new C().rec.compute();
new C().rec.invoke();
fail();
}
catch (IllegalStateException e) {
@@ -187,13 +189,13 @@ public class StorageManagerTest extends TestCase {
NullableLazyValue<String> rec = m.createNullableLazyValue(new Computable<String>() {
@Override
public String compute() {
return rec.compute();
return rec.invoke();
}
});
}
try {
new C().rec.compute();
new C().rec.invoke();
fail();
}
catch (IllegalStateException e) {
@@ -206,13 +208,13 @@ public class StorageManagerTest extends TestCase {
NotNullLazyValue<String> rec = m.createRecursionTolerantLazyValue(new Computable<String>() {
@Override
public String compute() {
assertEquals("rec", rec.compute());
assertEquals("rec", rec.invoke());
return "tolerant!";
}
}, "rec");
}
assertEquals("tolerant!", new C().rec.compute());
assertEquals("tolerant!", new C().rec.invoke());
}
public void testNullableRecursionTolerance() throws Exception {
@@ -220,13 +222,13 @@ public class StorageManagerTest extends TestCase {
NullableLazyValue<String> rec = m.createRecursionTolerantNullableLazyValue(new Computable<String>() {
@Override
public String compute() {
assertEquals(null, rec.compute());
assertEquals(null, rec.invoke());
return "tolerant!";
}
}, null);
}
assertEquals("tolerant!", new C().rec.compute());
assertEquals("tolerant!", new C().rec.invoke());
}
public void testRecursionIntoleranceWithPostCompute() throws Exception {
@@ -236,7 +238,7 @@ public class StorageManagerTest extends TestCase {
new Computable<String>() {
@Override
public String compute() {
return rec.compute();
return rec.invoke();
}
},
null,
@@ -245,7 +247,7 @@ public class StorageManagerTest extends TestCase {
}
try {
new C().rec.compute();
new C().rec.invoke();
fail();
}
catch (IllegalStateException e) {
@@ -260,7 +262,7 @@ public class StorageManagerTest extends TestCase {
new Computable<String>() {
@Override
public String compute() {
return rec.compute();
return rec.invoke();
}
},
new Function<Boolean, String>() {
@@ -280,8 +282,8 @@ public class StorageManagerTest extends TestCase {
}
C c = new C();
assertEquals("tolerant", c.rec.compute());
c.rec.compute();
assertEquals("tolerant", c.rec.invoke());
c.rec.invoke();
assertEquals("postCompute() called more than once", 1, counter.getCount());
}
@@ -306,8 +308,8 @@ public class StorageManagerTest extends TestCase {
}
);
assertEquals(Arrays.asList("first", "postComputed"), v.compute());
v.compute();
assertEquals(Arrays.asList("first", "postComputed"), v.invoke());
v.invoke();
assertEquals(1, counter.getCount());
}
@@ -331,8 +333,8 @@ public class StorageManagerTest extends TestCase {
}
);
assertEquals(Arrays.asList("first", "postComputed"), v.compute());
v.compute();
assertEquals(Arrays.asList("first", "postComputed"), v.invoke());
v.invoke();
assertEquals(1, counter.getCount());
}
@@ -343,7 +345,7 @@ public class StorageManagerTest extends TestCase {
new Computable<String>() {
@Override
public String compute() {
return rec.compute();
return rec.invoke();
}
},
new Function<Boolean, String>() {
@@ -366,23 +368,23 @@ public class StorageManagerTest extends TestCase {
C c = new C();
try {
c.rec.compute();
c.rec.invoke();
fail();
}
catch (ReenteringLazyValueComputationException e) {
// OK
}
assertEquals("second", c.rec.compute());
assertEquals("second", c.rec.invoke());
}
// Utilities
private static <K, V> Computable<V> apply(final Function<K, V> f, final K x) {
return new Computable<V>() {
private static <K, V> Function0<V> apply(final Function1<K, V> f, final K x) {
return new Function0<V>() {
@Override
public V compute() {
return f.fun(x);
public V invoke() {
return f.invoke(x);
}
};
}