Resolve sessions use exception tracking from StorageManager

This commit is contained in:
Andrey Breslav
2014-01-30 20:46:21 +04:00
parent 0f4994f8b0
commit 7a6657d2e8
8 changed files with 48 additions and 75 deletions
@@ -18,7 +18,7 @@ package org.jetbrains.jet.di;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.storage.LockBasedStorageManager; import org.jetbrains.jet.storage.LockBasedStorageManagerWithExceptionTracking;
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; 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.TraceBasedExternalSignatureResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache;
@@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProviderImpl; import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProviderImpl;
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.storage.ExceptionTracker;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver;
@@ -50,7 +51,7 @@ public class InjectorForJavaDescriptorResolver {
private final Project project; private final Project project;
private final BindingTrace bindingTrace; private final BindingTrace bindingTrace;
private final LockBasedStorageManager lockBasedStorageManager; private final LockBasedStorageManagerWithExceptionTracking storageManager;
private final JavaClassFinderImpl javaClassFinder; private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
private final TraceBasedJavaResolverCache traceBasedJavaResolverCache; private final TraceBasedJavaResolverCache traceBasedJavaResolverCache;
@@ -61,6 +62,7 @@ public class InjectorForJavaDescriptorResolver {
private final JavaPackageFragmentProviderImpl javaPackageFragmentProvider; private final JavaPackageFragmentProviderImpl javaPackageFragmentProvider;
private final VirtualFileFinder virtualFileFinder; private final VirtualFileFinder virtualFileFinder;
private final ModuleDescriptorImpl module; private final ModuleDescriptorImpl module;
private final ExceptionTracker exceptionTracker;
private final JavaAnnotationResolver javaAnnotationResolver; private final JavaAnnotationResolver javaAnnotationResolver;
private final JavaAnnotationArgumentResolver javaAnnotationArgumentResolver; private final JavaAnnotationArgumentResolver javaAnnotationArgumentResolver;
private final JavaClassResolver javaClassResolver; private final JavaClassResolver javaClassResolver;
@@ -81,7 +83,8 @@ public class InjectorForJavaDescriptorResolver {
) { ) {
this.project = project; this.project = project;
this.bindingTrace = bindingTrace; this.bindingTrace = bindingTrace;
this.lockBasedStorageManager = new LockBasedStorageManager(); this.exceptionTracker = new ExceptionTracker();
this.storageManager = new LockBasedStorageManagerWithExceptionTracking(exceptionTracker);
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 +99,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(getLockBasedStorageManager()); this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(getStorageManager());
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 +132,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(lockBasedStorageManager); this.javaDescriptorResolver.setStorageManager(storageManager);
javaPackageFragmentProvider.setCache(traceBasedJavaResolverCache); javaPackageFragmentProvider.setCache(traceBasedJavaResolverCache);
javaPackageFragmentProvider.setDeserializedDescriptorResolver(deserializedDescriptorResolver); javaPackageFragmentProvider.setDeserializedDescriptorResolver(deserializedDescriptorResolver);
@@ -162,7 +165,7 @@ public class InjectorForJavaDescriptorResolver {
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
deserializedDescriptorResolver.setJavaPackageFragmentProvider(javaPackageFragmentProvider); deserializedDescriptorResolver.setJavaPackageFragmentProvider(javaPackageFragmentProvider);
deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager); deserializedDescriptorResolver.setStorageManager(storageManager);
annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter); annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter);
annotationDescriptorDeserializer.setJavaDescriptorResolver(javaDescriptorResolver); annotationDescriptorDeserializer.setJavaDescriptorResolver(javaDescriptorResolver);
@@ -211,8 +214,8 @@ public class InjectorForJavaDescriptorResolver {
public void destroy() { public void destroy() {
} }
public LockBasedStorageManager getLockBasedStorageManager() { public LockBasedStorageManagerWithExceptionTracking getStorageManager() {
return this.lockBasedStorageManager; return this.storageManager;
} }
public JavaClassFinderImpl getJavaClassFinder() { public JavaClassFinderImpl getJavaClassFinder() {
@@ -40,6 +40,7 @@ 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.jet.storage.LockBasedStorageManager;
import org.jetbrains.jet.storage.LockBasedStorageManagerWithExceptionTracking;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -100,7 +101,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
LockBasedStorageManager storageManager = injector.getLockBasedStorageManager(); LockBasedStorageManagerWithExceptionTracking storageManager = injector.getStorageManager();
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) {
@@ -62,6 +62,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
}; };
private final LazyResolveStorageManager storageManager; private final LazyResolveStorageManager storageManager;
private final ExceptionTracker exceptionTracker;
private final ModuleDescriptor module; private final ModuleDescriptor module;
@@ -80,24 +81,30 @@ public class ResolveSession implements KotlinCodeAnalyzer {
public ResolveSession( public ResolveSession(
@NotNull Project project, @NotNull Project project,
@NotNull LockBasedStorageManager storageManager, @NotNull LockBasedStorageManagerWithExceptionTracking storageManager,
@NotNull ModuleDescriptorImpl rootDescriptor, @NotNull ModuleDescriptorImpl rootDescriptor,
@NotNull DeclarationProviderFactory declarationProviderFactory @NotNull DeclarationProviderFactory declarationProviderFactory
) { ) {
this(project, storageManager, rootDescriptor, declarationProviderFactory, NO_ALIASES, this(project,
storageManager,
storageManager.getTracker(),
rootDescriptor,
declarationProviderFactory,
NO_ALIASES,
Predicates.<FqNameUnsafe>alwaysFalse(), Predicates.<FqNameUnsafe>alwaysFalse(),
new BindingTraceContext()); new BindingTraceContext());
} }
public ResolveSession( public ResolveSession(
@NotNull Project project, @NotNull Project project,
@NotNull LockBasedStorageManager storageManager, @NotNull LockBasedStorageManagerWithExceptionTracking storageManager,
@NotNull ModuleDescriptorImpl rootDescriptor, @NotNull ModuleDescriptorImpl rootDescriptor,
@NotNull DeclarationProviderFactory declarationProviderFactory, @NotNull DeclarationProviderFactory declarationProviderFactory,
@NotNull BindingTrace delegationTrace @NotNull BindingTrace delegationTrace
) { ) {
this(project, this(project,
storageManager, storageManager,
storageManager.getTracker(),
rootDescriptor, rootDescriptor,
declarationProviderFactory, declarationProviderFactory,
NO_ALIASES, NO_ALIASES,
@@ -109,6 +116,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
public ResolveSession( public ResolveSession(
@NotNull Project project, @NotNull Project project,
@NotNull LockBasedStorageManager storageManager, @NotNull LockBasedStorageManager storageManager,
@NotNull ExceptionTracker exceptionTracker,
@NotNull ModuleDescriptorImpl rootDescriptor, @NotNull ModuleDescriptorImpl rootDescriptor,
@NotNull DeclarationProviderFactory declarationProviderFactory, @NotNull DeclarationProviderFactory declarationProviderFactory,
@NotNull Function<FqName, Name> classifierAliases, @NotNull Function<FqName, Name> classifierAliases,
@@ -117,6 +125,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
) { ) {
LockBasedLazyResolveStorageManager lockBasedLazyResolveStorageManager = new LockBasedLazyResolveStorageManager(storageManager); LockBasedLazyResolveStorageManager lockBasedLazyResolveStorageManager = new LockBasedLazyResolveStorageManager(storageManager);
this.storageManager = lockBasedLazyResolveStorageManager; this.storageManager = lockBasedLazyResolveStorageManager;
this.exceptionTracker = exceptionTracker;
this.classifierAliases = classifierAliases; this.classifierAliases = classifierAliases;
this.specialClasses = specialClasses; this.specialClasses = specialClasses;
this.trace = lockBasedLazyResolveStorageManager.createSafeTrace(delegationTrace); this.trace = lockBasedLazyResolveStorageManager.createSafeTrace(delegationTrace);
@@ -194,6 +203,11 @@ public class ResolveSession implements KotlinCodeAnalyzer {
return storageManager; return storageManager;
} }
@NotNull
public ExceptionTracker getExceptionTracker() {
return exceptionTracker;
}
@Override @Override
@NotNull @NotNull
public ClassDescriptor getClassDescriptor(@NotNull JetClassOrObject classOrObject) { public ClassDescriptor getClassDescriptor(@NotNull JetClassOrObject classOrObject) {
@@ -32,7 +32,7 @@ import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProv
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 org.jetbrains.jet.storage.LockBasedStorageManagerWithExceptionTracking;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -58,7 +58,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());
LockBasedStorageManager storageManager = new LockBasedStorageManager(); LockBasedStorageManagerWithExceptionTracking storageManager = LockBasedStorageManagerWithExceptionTracking.create();
final ResolveSession resolveSession = new ResolveSession(getProject(), storageManager, lazyModule, final ResolveSession resolveSession = new ResolveSession(getProject(), storageManager, lazyModule,
new FileBasedDeclarationProviderFactory(storageManager, files)); new FileBasedDeclarationProviderFactory(storageManager, files));
@@ -44,6 +44,7 @@ import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolverDummyI
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
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.jet.storage.LockBasedStorageManager;
import org.jetbrains.jet.storage.LockBasedStorageManagerWithExceptionTracking;
import org.jetbrains.jet.storage.StorageManager; import org.jetbrains.jet.storage.StorageManager;
import java.io.IOException; import java.io.IOException;
@@ -152,7 +153,7 @@ public class GenerateInjectors {
generator.addParameter(BindingTrace.class); generator.addParameter(BindingTrace.class);
// Fields // Fields
generator.addPublicField(LockBasedStorageManager.class); generator.addField(true, LockBasedStorageManagerWithExceptionTracking.class, "storageManager", null);
generator.addPublicField(JavaClassFinderImpl.class); generator.addPublicField(JavaClassFinderImpl.class);
generator.addField(TraceBasedExternalSignatureResolver.class); generator.addField(TraceBasedExternalSignatureResolver.class);
generator.addField(TraceBasedJavaResolverCache.class); generator.addField(TraceBasedJavaResolverCache.class);
@@ -63,8 +63,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 org.jetbrains.jet.storage.LockBasedStorageManagerWithExceptionTracking;
import org.jetbrains.jet.storage.StorageManager;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -215,7 +214,7 @@ public class JetSourceNavigationHelper {
} }
Project project = decompiledDeclaration.getProject(); Project project = decompiledDeclaration.getProject();
LockBasedStorageManager storageManager = new LockBasedStorageManager(); LockBasedStorageManagerWithExceptionTracking storageManager = LockBasedStorageManagerWithExceptionTracking.create();
FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(storageManager, getContainingFiles(candidates), FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(storageManager, getContainingFiles(candidates),
new Predicate<FqName>() { new Predicate<FqName>() {
@Override @Override
@@ -16,9 +16,7 @@
package org.jetbrains.jet.plugin.project; package org.jetbrains.jet.plugin.project;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.ModificationTracker; import com.intellij.openapi.util.ModificationTracker;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
@@ -32,13 +30,10 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer; import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import java.util.concurrent.atomic.AtomicLong;
public class CancelableResolveSession implements KotlinCodeAnalyzer, ModificationTracker { public class CancelableResolveSession implements KotlinCodeAnalyzer, ModificationTracker {
private final Object createdForObject; private final Object createdForObject;
private final ResolveSession resolveSession; private final ResolveSession resolveSession;
private final ResolveElementCache resolveElementCache; private final ResolveElementCache resolveElementCache;
private final AtomicLong canceledTracker = new AtomicLong();
public CancelableResolveSession(@NotNull JetFile file, @NotNull ResolveSession resolveSession) { public CancelableResolveSession(@NotNull JetFile file, @NotNull ResolveSession resolveSession) {
this(file, file.getProject(), resolveSession); this(file, file.getProject(), resolveSession);
@@ -55,82 +50,41 @@ public class CancelableResolveSession implements KotlinCodeAnalyzer, Modificatio
} }
@NotNull @NotNull
public BindingContext resolveToElement(final JetElement element) { public BindingContext resolveToElement(JetElement element) {
return computableWithProcessingCancel(new Computable<BindingContext>() { return resolveElementCache.resolveToElement(element);
@Override
public BindingContext compute() {
return resolveElementCache.resolveToElement(element);
}
});
} }
@Override @Override
public ModuleDescriptor getModuleDescriptor() { public ModuleDescriptor getModuleDescriptor() {
return computableWithProcessingCancel(new Computable<ModuleDescriptor>() { return resolveSession.getModuleDescriptor();
@Override
public ModuleDescriptor compute() {
return resolveSession.getModuleDescriptor();
}
});
} }
@NotNull @NotNull
@Override @Override
public ClassDescriptor getClassDescriptor(@NotNull final JetClassOrObject classOrObject) { public ClassDescriptor getClassDescriptor(@NotNull JetClassOrObject classOrObject) {
return computableWithProcessingCancel(new Computable<ClassDescriptor>() { return resolveSession.getClassDescriptor(classOrObject);
@Override
public ClassDescriptor compute() {
return resolveSession.getClassDescriptor(classOrObject);
}
});
} }
@NotNull @NotNull
@Override @Override
public BindingContext getBindingContext() { public BindingContext getBindingContext() {
return computableWithProcessingCancel(new Computable<BindingContext>() { return resolveSession.getBindingContext();
@Override
public BindingContext compute() {
return resolveSession.getBindingContext();
}
});
} }
@NotNull @NotNull
@Override @Override
public DeclarationDescriptor resolveToDescriptor(final JetDeclaration declaration) { public DeclarationDescriptor resolveToDescriptor(JetDeclaration declaration) {
return computableWithProcessingCancel(new Computable<DeclarationDescriptor>() { return resolveSession.resolveToDescriptor(declaration);
@Override
public DeclarationDescriptor compute() {
return resolveSession.resolveToDescriptor(declaration);
}
});
} }
@Override @Override
public void forceResolveAll() { public void forceResolveAll() {
computableWithProcessingCancel(new Computable<Integer>() { resolveSession.forceResolveAll();
@Override
public Integer compute() {
resolveSession.forceResolveAll();
return 0;
}
});
}
private <T> T computableWithProcessingCancel(Computable<T> computable) {
try {
return computable.compute();
}
catch (ProcessCanceledException canceledException) {
canceledTracker.getAndIncrement();
throw canceledException;
}
} }
@Override @Override
public long getModificationCount() { public long getModificationCount() {
return canceledTracker.get(); return resolveSession.getExceptionTracker().getModificationCount();
} }
@Override @Override
@@ -38,6 +38,7 @@ 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.jet.storage.LockBasedStorageManager;
import org.jetbrains.jet.storage.LockBasedStorageManagerWithExceptionTracking;
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) {
LockBasedStorageManager storageManager = new LockBasedStorageManager(); LockBasedStorageManagerWithExceptionTracking storageManager = LockBasedStorageManagerWithExceptionTracking.create();
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>");