Same storage manager used by lazy resolve session in AnalyzerFacadeForJVM and the rest of the components

This commit is contained in:
Andrey Breslav
2014-01-17 12:29:37 +04:00
parent 1af71c4dbe
commit 8f56283771
8 changed files with 122 additions and 18 deletions
@@ -50,7 +50,7 @@ public class InjectorForJavaDescriptorResolver {
private final Project project; private final Project project;
private final BindingTrace bindingTrace; private final BindingTrace bindingTrace;
private final LockBasedStorageManager storageManager; private final LockBasedStorageManager lockBasedStorageManager;
private final JavaClassFinderImpl javaClassFinder; private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
private final TraceBasedJavaResolverCache traceBasedJavaResolverCache; private final TraceBasedJavaResolverCache traceBasedJavaResolverCache;
@@ -81,7 +81,7 @@ public class InjectorForJavaDescriptorResolver {
) { ) {
this.project = project; this.project = project;
this.bindingTrace = bindingTrace; this.bindingTrace = bindingTrace;
this.storageManager = new LockBasedStorageManager(); this.lockBasedStorageManager = new LockBasedStorageManager();
this.javaClassFinder = new JavaClassFinderImpl(); this.javaClassFinder = new JavaClassFinderImpl();
this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver();
this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache(); this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache();
@@ -96,7 +96,7 @@ public class InjectorForJavaDescriptorResolver {
this.javaAnnotationArgumentResolver = new JavaAnnotationArgumentResolver(); this.javaAnnotationArgumentResolver = new JavaAnnotationArgumentResolver();
this.javaClassResolver = new JavaClassResolver(); this.javaClassResolver = new JavaClassResolver();
this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); this.deserializedDescriptorResolver = new DeserializedDescriptorResolver();
this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(storageManager); this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(getLockBasedStorageManager());
this.javaFunctionResolver = new JavaFunctionResolver(); this.javaFunctionResolver = new JavaFunctionResolver();
this.javaTypeParameterResolver = new JavaTypeParameterResolver(); this.javaTypeParameterResolver = new JavaTypeParameterResolver();
this.javaTypeTransformer = new JavaTypeTransformer(); this.javaTypeTransformer = new JavaTypeTransformer();
@@ -129,7 +129,7 @@ public class InjectorForJavaDescriptorResolver {
this.javaDescriptorResolver.setModule(module); this.javaDescriptorResolver.setModule(module);
this.javaDescriptorResolver.setPackageFragmentProvider(javaPackageFragmentProvider); this.javaDescriptorResolver.setPackageFragmentProvider(javaPackageFragmentProvider);
this.javaDescriptorResolver.setSignatureChecker(psiBasedMethodSignatureChecker); this.javaDescriptorResolver.setSignatureChecker(psiBasedMethodSignatureChecker);
this.javaDescriptorResolver.setStorageManager(storageManager); this.javaDescriptorResolver.setStorageManager(lockBasedStorageManager);
javaPackageFragmentProvider.setCache(traceBasedJavaResolverCache); javaPackageFragmentProvider.setCache(traceBasedJavaResolverCache);
javaPackageFragmentProvider.setDeserializedDescriptorResolver(deserializedDescriptorResolver); javaPackageFragmentProvider.setDeserializedDescriptorResolver(deserializedDescriptorResolver);
@@ -162,7 +162,7 @@ public class InjectorForJavaDescriptorResolver {
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
deserializedDescriptorResolver.setJavaPackageFragmentProvider(javaPackageFragmentProvider); deserializedDescriptorResolver.setJavaPackageFragmentProvider(javaPackageFragmentProvider);
deserializedDescriptorResolver.setStorageManager(storageManager); deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager);
annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter); annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter);
annotationDescriptorDeserializer.setJavaDescriptorResolver(javaDescriptorResolver); annotationDescriptorDeserializer.setJavaDescriptorResolver(javaDescriptorResolver);
@@ -211,6 +211,10 @@ public class InjectorForJavaDescriptorResolver {
public void destroy() { public void destroy() {
} }
public LockBasedStorageManager getLockBasedStorageManager() {
return this.lockBasedStorageManager;
}
public JavaClassFinderImpl getJavaClassFinder() { public JavaClassFinderImpl getJavaClassFinder() {
return this.javaClassFinder; return this.javaClassFinder;
} }
@@ -100,7 +100,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
final JavaClassFinderImpl classFinder = injector.getJavaClassFinder(); final JavaClassFinderImpl classFinder = injector.getJavaClassFinder();
// TODO: Replace with stub declaration provider // TODO: Replace with stub declaration provider
LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager(); LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager(injector.getLockBasedStorageManager());
FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(storageManager, files, new Predicate<FqName>() { FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(storageManager, files, new Predicate<FqName>() {
@Override @Override
public boolean apply(FqName fqName) { public boolean apply(FqName fqName) {
@@ -18,7 +18,9 @@ package org.jetbrains.jet.lang.resolve.lazy.storage;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.intellij.util.containers.ConcurrentWeakValueHashMap; import com.intellij.util.containers.ConcurrentWeakValueHashMap;
import jet.Function0;
import jet.Function1; import jet.Function1;
import jet.Unit;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly; import org.jetbrains.annotations.TestOnly;
@@ -26,23 +28,27 @@ import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.Diagnostics; import org.jetbrains.jet.lang.resolve.Diagnostics;
import org.jetbrains.jet.storage.LockBasedStorageManager; import org.jetbrains.jet.storage.*;
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.util.slicedmap.ReadOnlySlice; import org.jetbrains.jet.util.slicedmap.ReadOnlySlice;
import org.jetbrains.jet.util.slicedmap.WritableSlice; import org.jetbrains.jet.util.slicedmap.WritableSlice;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
public class LockBasedLazyResolveStorageManager extends LockBasedStorageManager implements LazyResolveStorageManager { public class LockBasedLazyResolveStorageManager implements LazyResolveStorageManager {
private final LockBasedStorageManager storageManager;
public LockBasedLazyResolveStorageManager(@NotNull LockBasedStorageManager storageManager) {
this.storageManager = storageManager;
}
@Override @Override
@NotNull @NotNull
public <K, V> MemoizedFunctionToNotNull<K, V> createWeaklyRetainedMemoizedFunction( public <K, V> MemoizedFunctionToNotNull<K, V> createWeaklyRetainedMemoizedFunction(
@NotNull Function1<K, V> compute @NotNull Function1<K, V> compute
) { ) {
return super.createMemoizedFunction(compute, new ConcurrentWeakValueHashMap<K, Object>()); return storageManager.new Internals().createMemoizedFunction(compute, new ConcurrentWeakValueHashMap<K, Object>());
} }
@NotNull @NotNull
@@ -50,7 +56,7 @@ public class LockBasedLazyResolveStorageManager extends LockBasedStorageManager
public <K, V> MemoizedFunctionToNullable<K, V> createWeaklyRetainedMemoizedFunctionWithNullableValues( public <K, V> MemoizedFunctionToNullable<K, V> createWeaklyRetainedMemoizedFunctionWithNullableValues(
@NotNull Function1<K, V> compute @NotNull Function1<K, V> compute
) { ) {
return super.createMemoizedFunctionWithNullableValues(compute, new ConcurrentWeakValueHashMap<K, Object>()); return storageManager.new Internals().createMemoizedFunctionWithNullableValues(compute, new ConcurrentWeakValueHashMap<K, Object>());
} }
@NotNull @NotNull
@@ -58,7 +64,73 @@ public class LockBasedLazyResolveStorageManager extends LockBasedStorageManager
public BindingTrace createSafeTrace(@NotNull BindingTrace originalTrace) { public BindingTrace createSafeTrace(@NotNull BindingTrace originalTrace) {
// It seems safe to have a separate lock for traces: // It seems safe to have a separate lock for traces:
// no other locks will be acquired inside the trace operations // no other locks will be acquired inside the trace operations
return new LockProtectedTrace(lock, originalTrace); return new LockProtectedTrace(storageManager.new Internals().getLock(), originalTrace);
}
@NotNull
@Override
public <K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction(@NotNull Function1<? super K, ? extends V> compute) {
return storageManager.createMemoizedFunction(compute);
}
@NotNull
@Override
public <K, V> MemoizedFunctionToNullable<K, V> createMemoizedFunctionWithNullableValues(@NotNull Function1<? super K, ? extends V> compute) {
return storageManager.createMemoizedFunctionWithNullableValues(compute);
}
@NotNull
@Override
public <T> NotNullLazyValue<T> createLazyValue(@NotNull Function0<? extends T> computable) {
return storageManager.createLazyValue(computable);
}
@NotNull
@Override
public <T> NotNullLazyValue<T> createRecursionTolerantLazyValue(
@NotNull Function0<? extends T> computable,
@NotNull T onRecursiveCall
) {
return storageManager.createRecursionTolerantLazyValue(computable, onRecursiveCall);
}
@NotNull
@Override
public <T> NotNullLazyValue<T> createLazyValueWithPostCompute(
@NotNull Function0<? extends T> computable,
@Nullable Function1<? super Boolean, ? extends T> onRecursiveCall,
@NotNull Function1<? super T, ? extends Unit> postCompute
) {
return storageManager.createLazyValueWithPostCompute(computable, onRecursiveCall, postCompute);
}
@NotNull
@Override
public <T> NullableLazyValue<T> createNullableLazyValue(@NotNull Function0<? extends T> computable) {
return storageManager.createNullableLazyValue(computable);
}
@NotNull
@Override
public <T> NullableLazyValue<T> createRecursionTolerantNullableLazyValue(
@NotNull Function0<? extends T> computable,
T onRecursiveCall
) {
return storageManager.createRecursionTolerantNullableLazyValue(computable, onRecursiveCall);
}
@NotNull
@Override
public <T> NullableLazyValue<T> createNullableLazyValueWithPostCompute(
@NotNull Function0<? extends T> computable,
@NotNull Function1<? super T, ? extends Unit> postCompute
) {
return storageManager.createNullableLazyValueWithPostCompute(computable, postCompute);
}
@Override
public <T> T compute(@NotNull Function0<? extends T> computable) {
return storageManager.compute(computable);
} }
private static class LockProtectedContext implements BindingContext { private static class LockProtectedContext implements BindingContext {
@@ -33,6 +33,7 @@ import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedLazyResolveStorageMa
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.storage.LockBasedStorageManager;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -58,7 +59,7 @@ public abstract class AbstractLazyResolveDescriptorRendererTest extends KotlinTe
final ModuleDescriptorImpl lazyModule = AnalyzerFacadeForJVM.createJavaModule("<lazy module>"); final ModuleDescriptorImpl lazyModule = AnalyzerFacadeForJVM.createJavaModule("<lazy module>");
lazyModule.addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider()); lazyModule.addFragmentProvider(DependencyKind.BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager(); LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager(new LockBasedStorageManager());
final ResolveSession resolveSession = new ResolveSession(getProject(), storageManager, lazyModule, final ResolveSession resolveSession = new ResolveSession(getProject(), storageManager, lazyModule,
new FileBasedDeclarationProviderFactory(storageManager, files)); new FileBasedDeclarationProviderFactory(storageManager, files));
@@ -61,7 +61,7 @@ public class LockBasedStorageManager implements StorageManager {
} }
@NotNull @NotNull
protected <K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction( protected <K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction(
@NotNull Function1<? super K, ? extends V> compute, @NotNull Function1<? super K, ? extends V> compute,
@NotNull ConcurrentMap<K, Object> map @NotNull ConcurrentMap<K, Object> map
) { ) {
@@ -374,4 +374,29 @@ public class LockBasedStorageManager implements StorageManager {
return result; return result;
} }
} }
@Deprecated // Use with care
public class Internals {
@NotNull
public Lock getLock() {
return lock;
}
@NotNull
public <K, V> MemoizedFunctionToNotNull<K, V> createMemoizedFunction(
@NotNull Function1<? super K, ? extends V> compute,
@NotNull ConcurrentMap<K, Object> map
) {
return LockBasedStorageManager.this.createMemoizedFunction(compute, map);
}
@NotNull
public <K, V> MemoizedFunctionToNullable<K, V> createMemoizedFunctionWithNullableValues(
@NotNull Function1<? super K, ? extends V> compute,
@NotNull ConcurrentMap<K, Object> map
) {
return LockBasedStorageManager.this.createMemoizedFunctionWithNullableValues(compute, map);
}
}
} }
@@ -152,7 +152,7 @@ public class GenerateInjectors {
generator.addParameter(BindingTrace.class); generator.addParameter(BindingTrace.class);
// Fields // Fields
generator.addField(false, StorageManager.class, null, new InstantiateType(LockBasedStorageManager.class)); generator.addPublicField(LockBasedStorageManager.class);
generator.addPublicField(JavaClassFinderImpl.class); generator.addPublicField(JavaClassFinderImpl.class);
generator.addField(TraceBasedExternalSignatureResolver.class); generator.addField(TraceBasedExternalSignatureResolver.class);
generator.addField(TraceBasedJavaResolverCache.class); generator.addField(TraceBasedJavaResolverCache.class);
@@ -64,6 +64,7 @@ import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex; import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex;
import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex;
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex;
import org.jetbrains.jet.storage.LockBasedStorageManager;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -214,7 +215,7 @@ public class JetSourceNavigationHelper {
} }
Project project = decompiledDeclaration.getProject(); Project project = decompiledDeclaration.getProject();
LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager(); LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager(new LockBasedStorageManager());
FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(storageManager, getContainingFiles(candidates), FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(storageManager, getContainingFiles(candidates),
new Predicate<FqName>() { new Predicate<FqName>() {
@Override @Override
@@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedLazyResolveStorageMa
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.storage.LockBasedStorageManager;
import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.config.Config;
import java.util.Collection; import java.util.Collection;
@@ -152,7 +153,7 @@ public final class AnalyzerFacadeForJS {
@NotNull @NotNull
public static ResolveSession getLazyResolveSession(Collection<JetFile> files, Config config) { public static ResolveSession getLazyResolveSession(Collection<JetFile> files, Config config) {
LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager(); LockBasedLazyResolveStorageManager storageManager = new LockBasedLazyResolveStorageManager(new LockBasedStorageManager());
FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory( FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(
storageManager, Config.withJsLibAdded(files, config), Predicates.<FqName>alwaysFalse()); storageManager, Config.withJsLibAdded(files, config), Predicates.<FqName>alwaysFalse());
ModuleDescriptorImpl module = createJsModule("<lazy module>"); ModuleDescriptorImpl module = createJsModule("<lazy module>");