From c4ab5a852f78b9905f4b062b3cb02196a1687144 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 8 Feb 2013 13:27:55 +0400 Subject: [PATCH] Thread-safe lazy values introduced into FilteringClassLikeInfo --- .../resolve/lazy/LazyClassDescriptor.java | 8 +++---- .../lazy/data/FilteringClassLikeInfo.java | 24 ++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java index c4eafce035f..698386e16b6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java @@ -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; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/data/FilteringClassLikeInfo.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/data/FilteringClassLikeInfo.java index 18af80ceb9b..8ae06aa2e03 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/data/FilteringClassLikeInfo.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/data/FilteringClassLikeInfo.java @@ -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 declarationFilter; - private List filteredDeclarations; + private final LazyValue> filteredDeclarations; - public FilteringClassLikeInfo(@NotNull JetClassLikeInfo delegate, @NotNull Predicate declarationFilter) { + public FilteringClassLikeInfo( + @NotNull StorageManager storageManager, + @NotNull final JetClassLikeInfo delegate, + @NotNull final Predicate declarationFilter + ) { this.delegate = delegate; - this.declarationFilter = declarationFilter; + this.filteredDeclarations = storageManager.createLazyValue(new Computable>() { + @Override + public List compute() { + return Lists.newArrayList(Collections2.filter(delegate.getDeclarations(), declarationFilter)); + } + }); } @NotNull @@ -95,10 +106,7 @@ public class FilteringClassLikeInfo implements JetClassLikeInfo { @Override @NotNull public List getDeclarations() { - if (filteredDeclarations == null) { - filteredDeclarations = Lists.newArrayList(Collections2.filter(delegate.getDeclarations(), declarationFilter)); - } - return filteredDeclarations; + return filteredDeclarations.get(); } @Override