diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/AnnotationDescriptorDeserializer.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/AnnotationDescriptorDeserializer.java index 0bf92913b36..c0ce11045d9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/AnnotationDescriptorDeserializer.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/AnnotationDescriptorDeserializer.java @@ -34,6 +34,9 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.java.*; +import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedStorageManager; +import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNotNull; +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.utils.ExceptionUtils; @@ -51,6 +54,24 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer private JavaClassResolver javaClassResolver; + // TODO: a single instance of StorageManager for all computations in resolve-java + private final LockBasedStorageManager storageManager = new LockBasedStorageManager(); + + private final MemoizedFunctionToNotNull>> memberAnnotations = + storageManager.createMemoizedFunction( + new MemoizedFunctionToNotNull>>() { + @NotNull + @Override + public Map> fun(@NotNull VirtualFile file) { + try { + return loadMemberAnnotationsFromFile(file); + } + catch (IOException e) { + throw ExceptionUtils.rethrow(e); + } + } + }, StorageManager.ReferenceKind.STRONG); + @Inject public void setPsiClassFinder(PsiClassFinder psiClassFinder) { this.psiClassFinder = psiClassFinder; @@ -186,16 +207,8 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer VirtualFile file = getVirtualFileWithMemberAnnotations(container, proto, nameResolver); - try { - // TODO: calculate this only once for each container - Map> memberAnnotations = loadMemberAnnotationsFromFile(file); - - List annotations = memberAnnotations.get(signature); - return annotations == null ? Collections.emptyList() : annotations; - } - catch (IOException e) { - throw ExceptionUtils.rethrow(e); - } + List annotations = memberAnnotations.fun(file).get(signature); + return annotations == null ? Collections.emptyList() : annotations; } @NotNull