From 1af71c4dbeb2065a77ccfa0f7ff3a64eb5a3e0c9 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 16 Jan 2014 21:44:03 +0400 Subject: [PATCH] Using common storage manager for all lazy services --- .../di/InjectorForJavaDescriptorResolver.java | 7 +++- .../di/InjectorForTopDownAnalyzerForJvm.java | 7 +++- .../di/InjectorForTopDownAnalyzerBasic.java | 3 ++ .../resolve/java/JavaDescriptorResolver.java | 10 +++-- .../AnnotationDescriptorDeserializer.java | 41 ++++++++++--------- .../DeserializedDescriptorResolver.java | 9 +++- .../injectors/GenerateInjectors.java | 5 +++ .../di/InjectorForTopDownAnalyzerForJs.java | 3 ++ 8 files changed, 59 insertions(+), 26 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java index a76d700fef6..41546a95bda 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.di; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.storage.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache; @@ -49,6 +50,7 @@ public class InjectorForJavaDescriptorResolver { private final Project project; private final BindingTrace bindingTrace; + private final LockBasedStorageManager storageManager; private final JavaClassFinderImpl javaClassFinder; private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedJavaResolverCache traceBasedJavaResolverCache; @@ -79,6 +81,7 @@ public class InjectorForJavaDescriptorResolver { ) { this.project = project; this.bindingTrace = bindingTrace; + this.storageManager = new LockBasedStorageManager(); this.javaClassFinder = new JavaClassFinderImpl(); this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache(); @@ -93,7 +96,7 @@ public class InjectorForJavaDescriptorResolver { this.javaAnnotationArgumentResolver = new JavaAnnotationArgumentResolver(); this.javaClassResolver = new JavaClassResolver(); this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); - this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); + this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(storageManager); this.javaFunctionResolver = new JavaFunctionResolver(); this.javaTypeParameterResolver = new JavaTypeParameterResolver(); this.javaTypeTransformer = new JavaTypeTransformer(); @@ -126,6 +129,7 @@ public class InjectorForJavaDescriptorResolver { this.javaDescriptorResolver.setModule(module); this.javaDescriptorResolver.setPackageFragmentProvider(javaPackageFragmentProvider); this.javaDescriptorResolver.setSignatureChecker(psiBasedMethodSignatureChecker); + this.javaDescriptorResolver.setStorageManager(storageManager); javaPackageFragmentProvider.setCache(traceBasedJavaResolverCache); javaPackageFragmentProvider.setDeserializedDescriptorResolver(deserializedDescriptorResolver); @@ -158,6 +162,7 @@ public class InjectorForJavaDescriptorResolver { deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); deserializedDescriptorResolver.setJavaPackageFragmentProvider(javaPackageFragmentProvider); + deserializedDescriptorResolver.setStorageManager(storageManager); annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter); annotationDescriptorDeserializer.setJavaDescriptorResolver(javaDescriptorResolver); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 9af8e81f26d..5a24465248d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.resolve.BodyResolver; import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer; import org.jetbrains.jet.lang.resolve.DeclarationsChecker; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.storage.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters; @@ -81,6 +82,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final ControlFlowAnalyzer controlFlowAnalyzer; private final DeclarationsChecker declarationsChecker; private final DescriptorResolver descriptorResolver; + private final LockBasedStorageManager storageManager; private final CallResolverExtensionProvider callResolverExtensionProvider; private final Project project; private final TopDownAnalysisParameters topDownAnalysisParameters; @@ -141,6 +143,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.controlFlowAnalyzer = new ControlFlowAnalyzer(); this.declarationsChecker = new DeclarationsChecker(); this.descriptorResolver = new DescriptorResolver(); + this.storageManager = new LockBasedStorageManager(); this.callResolverExtensionProvider = new CallResolverExtensionProvider(); this.project = project; this.topDownAnalysisParameters = topDownAnalysisParameters; @@ -180,7 +183,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.javaAnnotationArgumentResolver = new JavaAnnotationArgumentResolver(); this.javaTypeTransformer = new JavaTypeTransformer(); this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); - this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); + this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(storageManager); this.javaFunctionResolver = new JavaFunctionResolver(); this.javaTypeParameterResolver = new JavaTypeParameterResolver(); this.javaValueParameterResolver = new JavaValueParameterResolver(); @@ -235,6 +238,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.javaDescriptorResolver.setModule(moduleDescriptor); this.javaDescriptorResolver.setPackageFragmentProvider(javaPackageFragmentProvider); this.javaDescriptorResolver.setSignatureChecker(psiBasedMethodSignatureChecker); + this.javaDescriptorResolver.setStorageManager(storageManager); javaClassFinder.setProject(project); @@ -352,6 +356,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); deserializedDescriptorResolver.setJavaPackageFragmentProvider(javaPackageFragmentProvider); + deserializedDescriptorResolver.setStorageManager(storageManager); annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter); annotationDescriptorDeserializer.setJavaDescriptorResolver(javaDescriptorResolver); diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java index 10503fcee0e..c6a3666e94c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.resolve.BodyResolver; import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer; import org.jetbrains.jet.lang.resolve.DeclarationsChecker; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.storage.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters; @@ -60,6 +61,7 @@ public class InjectorForTopDownAnalyzerBasic { private final ControlFlowAnalyzer controlFlowAnalyzer; private final DeclarationsChecker declarationsChecker; private final DescriptorResolver descriptorResolver; + private final LockBasedStorageManager storageManager; private final CallResolverExtensionProvider callResolverExtensionProvider; private final Project project; private final TopDownAnalysisParameters topDownAnalysisParameters; @@ -100,6 +102,7 @@ public class InjectorForTopDownAnalyzerBasic { this.controlFlowAnalyzer = new ControlFlowAnalyzer(); this.declarationsChecker = new DeclarationsChecker(); this.descriptorResolver = new DescriptorResolver(); + this.storageManager = new LockBasedStorageManager(); this.callResolverExtensionProvider = new CallResolverExtensionProvider(); this.project = project; this.topDownAnalysisParameters = topDownAnalysisParameters; diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 3a1d0829a0f..179760e1836 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.lang.resolve.kotlin.KotlinClassFinder; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver; -import org.jetbrains.jet.storage.LockBasedStorageManager; +import org.jetbrains.jet.storage.StorageManager; import javax.inject.Inject; @@ -46,8 +46,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes public static final Name JAVA_ROOT = Name.special(""); - private final LockBasedStorageManager storageManager = new LockBasedStorageManager(); - + private StorageManager storageManager; private JavaClassResolver classResolver; private JavaPackageFragmentProvider packageFragmentProvider; private JavaClassFinder javaClassFinder; @@ -61,6 +60,11 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes private KotlinClassFinder kotlinClassFinder; private ModuleDescriptor module; + @Inject + public void setStorageManager(StorageManager storageManager) { + this.storageManager = storageManager; + } + @Inject public void setClassResolver(JavaClassResolver classResolver) { this.classResolver = classResolver; diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java index be4076c78a4..8b61997b588 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java @@ -34,12 +34,15 @@ import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; -import org.jetbrains.jet.lang.resolve.java.resolver.*; +import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils; +import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolver; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.ErrorUtils; -import org.jetbrains.jet.storage.LockBasedStorageManager; import org.jetbrains.jet.storage.MemoizedFunctionToNotNull; +import org.jetbrains.jet.storage.StorageManager; import javax.inject.Inject; import java.io.IOException; @@ -56,25 +59,25 @@ public class AnnotationDescriptorDeserializer implements AnnotationDeserializer private KotlinClassFinder kotlinClassFinder; private ErrorReporter errorReporter; - // TODO: a single instance of StorageManager for all computations in resolve-java - private final LockBasedStorageManager storageManager = new LockBasedStorageManager(); + private final MemoizedFunctionToNotNull>> memberAnnotations; - private final MemoizedFunctionToNotNull>> memberAnnotations = - storageManager.createMemoizedFunction( - new Function1>>() { - @NotNull - @Override - public Map> invoke(@NotNull KotlinJvmBinaryClass kotlinClass) { - try { - return loadMemberAnnotationsFromClass(kotlinClass); - } - catch (IOException e) { - errorReporter.reportAnnotationLoadingError( - "Error loading member annotations from Kotlin class: " + kotlinClass, e); - return Collections.emptyMap(); - } + public AnnotationDescriptorDeserializer(@NotNull StorageManager storageManager) { + this.memberAnnotations = storageManager.createMemoizedFunction( + new Function1>>() { + @NotNull + @Override + public Map> invoke(@NotNull KotlinJvmBinaryClass kotlinClass) { + try { + return loadMemberAnnotationsFromClass(kotlinClass); } - }); + catch (IOException e) { + errorReporter.reportAnnotationLoadingError( + "Error loading member annotations from Kotlin class: " + kotlinClass, e); + return Collections.emptyMap(); + } + } + }); + } @Inject public void setJavaDescriptorResolver(JavaDescriptorResolver javaDescriptorResolver) { diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java index bc2ff784eed..c5442553e7c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java @@ -33,7 +33,7 @@ import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; -import org.jetbrains.jet.storage.LockBasedStorageManager; +import org.jetbrains.jet.storage.StorageManager; import javax.inject.Inject; import java.util.Collection; @@ -46,7 +46,7 @@ import static org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader.Kin public final class DeserializedDescriptorResolver { private AnnotationDescriptorDeserializer annotationDeserializer; - private final LockBasedStorageManager storageManager = new LockBasedStorageManager(); + private StorageManager storageManager; private JavaPackageFragmentProvider javaPackageFragmentProvider; @@ -89,6 +89,11 @@ public final class DeserializedDescriptorResolver { this.errorReporter = errorReporter; } + @Inject + public void setStorageManager(StorageManager storageManager) { + this.storageManager = storageManager; + } + @Nullable public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) { String[] data = readData(kotlinClass, CLASS); diff --git a/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.java b/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.java index 4e70f05984a..ed33c4f40f7 100644 --- a/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.java +++ b/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.di.DependencyInjectorGenerator; import org.jetbrains.jet.di.GivenExpression; import org.jetbrains.jet.di.InjectorForTopDownAnalyzer; +import org.jetbrains.jet.di.InstantiateType; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; @@ -43,6 +44,8 @@ import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolverDummyImpl; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; +import org.jetbrains.jet.storage.LockBasedStorageManager; +import org.jetbrains.jet.storage.StorageManager; import java.io.IOException; import java.util.Arrays; @@ -149,6 +152,7 @@ public class GenerateInjectors { generator.addParameter(BindingTrace.class); // Fields + generator.addField(false, StorageManager.class, null, new InstantiateType(LockBasedStorageManager.class)); generator.addPublicField(JavaClassFinderImpl.class); generator.addField(TraceBasedExternalSignatureResolver.class); generator.addField(TraceBasedJavaResolverCache.class); @@ -175,6 +179,7 @@ public class GenerateInjectors { generator.addPublicField(ControlFlowAnalyzer.class); generator.addPublicField(DeclarationsChecker.class); generator.addPublicField(DescriptorResolver.class); + generator.addField(false, StorageManager.class, null, new InstantiateType(LockBasedStorageManager.class)); generator.addField(CallResolverExtensionProvider.class); // Parameters diff --git a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java index 1bc81f6230b..050e857fcb0 100644 --- a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java +++ b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.resolve.BodyResolver; import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer; import org.jetbrains.jet.lang.resolve.DeclarationsChecker; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.storage.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters; @@ -60,6 +61,7 @@ public class InjectorForTopDownAnalyzerForJs { private final ControlFlowAnalyzer controlFlowAnalyzer; private final DeclarationsChecker declarationsChecker; private final DescriptorResolver descriptorResolver; + private final LockBasedStorageManager storageManager; private final CallResolverExtensionProvider callResolverExtensionProvider; private final Project project; private final TopDownAnalysisParameters topDownAnalysisParameters; @@ -99,6 +101,7 @@ public class InjectorForTopDownAnalyzerForJs { this.controlFlowAnalyzer = new ControlFlowAnalyzer(); this.declarationsChecker = new DeclarationsChecker(); this.descriptorResolver = new DescriptorResolver(); + this.storageManager = new LockBasedStorageManager(); this.callResolverExtensionProvider = new CallResolverExtensionProvider(); this.project = project; this.topDownAnalysisParameters = topDownAnalysisParameters;