Using common storage manager for all lazy services

This commit is contained in:
Andrey Breslav
2014-01-16 21:44:03 +04:00
parent 559f212cfc
commit 1af71c4dbe
8 changed files with 59 additions and 26 deletions
@@ -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);
@@ -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);
@@ -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;
@@ -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("<java_root>");
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;
@@ -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<KotlinJvmBinaryClass, Map<MemberSignature, List<AnnotationDescriptor>>> memberAnnotations;
private final MemoizedFunctionToNotNull<KotlinJvmBinaryClass, Map<MemberSignature, List<AnnotationDescriptor>>> memberAnnotations =
storageManager.createMemoizedFunction(
new Function1<KotlinJvmBinaryClass, Map<MemberSignature, List<AnnotationDescriptor>>>() {
@NotNull
@Override
public Map<MemberSignature, List<AnnotationDescriptor>> 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<KotlinJvmBinaryClass, Map<MemberSignature, List<AnnotationDescriptor>>>() {
@NotNull
@Override
public Map<MemberSignature, List<AnnotationDescriptor>> 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) {
@@ -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);
@@ -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
@@ -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;