From b04110e3a9e1b48c5ab96d78f44867a00e6fc366 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 12 Feb 2013 15:22:11 +0400 Subject: [PATCH] Explicit interfaces for memoized functions --- .../jet/lang/resolve/lazy/ScopeProvider.java | 3 ++- .../FileBasedDeclarationProviderFactory.java | 5 ++-- .../descriptors/AbstractLazyMemberScope.java | 13 +++++----- .../descriptors/LazyPackageMemberScope.java | 5 ++-- .../lazy/storage/LockBasedStorageManager.java | 10 ++++--- .../storage/MemoizedFunctionToNotNull.java | 26 +++++++++++++++++++ .../storage/MemoizedFunctionToNullable.java | 26 +++++++++++++++++++ .../resolve/lazy/storage/StorageManager.java | 4 +-- 8 files changed, 75 insertions(+), 17 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/MemoizedFunctionToNotNull.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/MemoizedFunctionToNullable.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java index ca42d13abe9..f26fe38f6ba 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ScopeProvider.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace; import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor; +import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNull; import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.scopes.ChainedScope; @@ -41,7 +42,7 @@ import static org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager.Referen public class ScopeProvider { private final ResolveSession resolveSession; - private final Function fileScopes; + private final MemoizedFunctionToNotNull fileScopes; private final NotNullLazyValue defaultImportsScope; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/FileBasedDeclarationProviderFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/FileBasedDeclarationProviderFactory.java index ea4599f7eaf..10478d4a23a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/FileBasedDeclarationProviderFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/declarations/FileBasedDeclarationProviderFactory.java @@ -28,9 +28,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamespaceHeader; +import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; +import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable; import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue; import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager; -import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.jet.lang.resolve.name.FqName; import java.util.Collection; @@ -48,7 +49,7 @@ public class FileBasedDeclarationProviderFactory implements DeclarationProviderF private final StorageManager storageManager; private final NotNullLazyValue index; - private final Function packageDeclarationProviders; + private final MemoizedFunctionToNullable packageDeclarationProviders; public FileBasedDeclarationProviderFactory(@NotNull StorageManager storageManager, @NotNull Collection files) { this(storageManager, files, Predicates.alwaysFalse()); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java index c9f50a63912..6ca95d0873c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java @@ -25,11 +25,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; -import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; -import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil; import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProvider; +import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNull; +import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue; +import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -47,11 +48,11 @@ public abstract class AbstractLazyMemberScope> classDescriptors; - private final Function> objectDescriptors; + private final MemoizedFunctionToNotNull> classDescriptors; + private final MemoizedFunctionToNotNull> objectDescriptors; - private final Function> functionDescriptors; - private final Function> propertyDescriptors; + private final MemoizedFunctionToNotNull> functionDescriptors; + private final MemoizedFunctionToNotNull> propertyDescriptors; private static class AllDescriptors { private final Collection all = Sets.newLinkedHashSet(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.java index bfe436471b0..5ef42733c8a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyPackageMemberScope.java @@ -24,8 +24,9 @@ import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; -import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager; import org.jetbrains.jet.lang.resolve.lazy.declarations.PackageMemberDeclarationProvider; +import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable; +import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -35,7 +36,7 @@ import java.util.Set; public class LazyPackageMemberScope extends AbstractLazyMemberScope { - private final Function packageDescriptors; + private final MemoizedFunctionToNullable packageDescriptors; public LazyPackageMemberScope(@NotNull ResolveSession resolveSession, @NotNull PackageMemberDeclarationProvider declarationProvider, diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/LockBasedStorageManager.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/LockBasedStorageManager.java index f34746166fb..ede853c1d04 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/LockBasedStorageManager.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/LockBasedStorageManager.java @@ -43,10 +43,11 @@ public class LockBasedStorageManager implements StorageManager { @NotNull @Override - public Function createMemoizedFunction(@NotNull final Function compute, @NotNull final ReferenceKind valuesReferenceKind) { - return new Function() { + public MemoizedFunctionToNotNull createMemoizedFunction(@NotNull final Function compute, @NotNull final ReferenceKind valuesReferenceKind) { + return new MemoizedFunctionToNotNull() { private final ConcurrentMap cache = createConcurrentMap(valuesReferenceKind); + @NotNull @Override public V fun(@NotNull final K input) { V value = cache.get(input); @@ -69,13 +70,14 @@ public class LockBasedStorageManager implements StorageManager { @NotNull @Override - public Function createMemoizedFunctionWithNullableValues( + public MemoizedFunctionToNullable createMemoizedFunctionWithNullableValues( @NotNull final Function compute, @NotNull final ReferenceKind valuesReferenceKind ) { - return new Function() { + return new MemoizedFunctionToNullable() { private final ConcurrentMap> cache = createConcurrentMap(valuesReferenceKind); @Override + @Nullable public V fun(@NotNull final K input) { NullableLazyValue lazyValue = cache.get(input); if (lazyValue != null) return lazyValue.compute(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/MemoizedFunctionToNotNull.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/MemoizedFunctionToNotNull.java new file mode 100644 index 00000000000..e5b2153a252 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/MemoizedFunctionToNotNull.java @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.lazy.storage; + +import com.intellij.util.Function; +import org.jetbrains.annotations.NotNull; + +public interface MemoizedFunctionToNotNull extends Function { + @Override + @NotNull + R fun(P p); +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/MemoizedFunctionToNullable.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/MemoizedFunctionToNullable.java new file mode 100644 index 00000000000..1b778163167 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/MemoizedFunctionToNullable.java @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.lazy.storage; + +import com.intellij.util.Function; +import org.jetbrains.annotations.Nullable; + +public interface MemoizedFunctionToNullable extends Function { + @Override + @Nullable + R fun(P p); +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/StorageManager.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/StorageManager.java index 90b4272a9d8..e5f651a3874 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/StorageManager.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/storage/StorageManager.java @@ -32,9 +32,9 @@ public interface StorageManager { * the value gets collected and then re-computed */ @NotNull - Function createMemoizedFunction(@NotNull Function compute, @NotNull ReferenceKind valuesReferenceKind); + MemoizedFunctionToNotNull createMemoizedFunction(@NotNull Function compute, @NotNull ReferenceKind valuesReferenceKind); @NotNull - Function createMemoizedFunctionWithNullableValues(@NotNull Function compute, @NotNull ReferenceKind valuesReferenceKind); + MemoizedFunctionToNullable createMemoizedFunctionWithNullableValues(@NotNull Function compute, @NotNull ReferenceKind valuesReferenceKind); @NotNull NotNullLazyValue createLazyValue(@NotNull Computable computable);