Thread-safe lazy values introduced into FilteringClassLikeInfo

This commit is contained in:
Andrey Breslav
2013-02-08 13:27:55 +04:00
parent 8a240e82bd
commit c4ab5a852f
2 changed files with 20 additions and 12 deletions
@@ -492,12 +492,12 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyDesc
}
}
private static JetClassLikeInfo noEnumEntries(JetClassLikeInfo classLikeInfo) {
return new FilteringClassLikeInfo(classLikeInfo, Predicates.not(ONLY_ENUM_ENTRIES));
private JetClassLikeInfo noEnumEntries(JetClassLikeInfo classLikeInfo) {
return new FilteringClassLikeInfo(resolveSession.getStorageManager(), classLikeInfo, Predicates.not(ONLY_ENUM_ENTRIES));
}
private static JetClassLikeInfo enumClassObjectInfo(JetClassLikeInfo classLikeInfo) {
return new FilteringClassLikeInfo(classLikeInfo, ONLY_ENUM_ENTRIES) {
private JetClassLikeInfo enumClassObjectInfo(JetClassLikeInfo classLikeInfo) {
return new FilteringClassLikeInfo(resolveSession.getStorageManager(), classLikeInfo, ONLY_ENUM_ENTRIES) {
@Override
public JetClassOrObject getCorrespondingClassOrObject() {
return null;
@@ -19,23 +19,34 @@ package org.jetbrains.jet.lang.resolve.lazy.data;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.Computable;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.lazy.LazyValue;
import org.jetbrains.jet.lang.resolve.lazy.StorageManager;
import org.jetbrains.jet.lang.resolve.name.FqName;
import java.util.List;
public class FilteringClassLikeInfo implements JetClassLikeInfo {
private final JetClassLikeInfo delegate;
private final Predicate<? super JetDeclaration> declarationFilter;
private List<JetDeclaration> filteredDeclarations;
private final LazyValue<List<JetDeclaration>> filteredDeclarations;
public FilteringClassLikeInfo(@NotNull JetClassLikeInfo delegate, @NotNull Predicate<? super JetDeclaration> declarationFilter) {
public FilteringClassLikeInfo(
@NotNull StorageManager storageManager,
@NotNull final JetClassLikeInfo delegate,
@NotNull final Predicate<? super JetDeclaration> declarationFilter
) {
this.delegate = delegate;
this.declarationFilter = declarationFilter;
this.filteredDeclarations = storageManager.createLazyValue(new Computable<List<JetDeclaration>>() {
@Override
public List<JetDeclaration> compute() {
return Lists.newArrayList(Collections2.filter(delegate.getDeclarations(), declarationFilter));
}
});
}
@NotNull
@@ -95,10 +106,7 @@ public class FilteringClassLikeInfo implements JetClassLikeInfo {
@Override
@NotNull
public List<JetDeclaration> getDeclarations() {
if (filteredDeclarations == null) {
filteredDeclarations = Lists.newArrayList(Collections2.filter(delegate.getDeclarations(), declarationFilter));
}
return filteredDeclarations;
return filteredDeclarations.get();
}
@Override