Don't share lazy resolve session between different clients. It can give slice overwrite exceptions.

This commit is contained in:
Nikolay Krasko
2012-09-04 14:18:10 +04:00
parent d2fa6abf4a
commit 2fdcfcfff4
@@ -68,7 +68,6 @@ public final class AnalyzerFacadeWithCache {
private final static Key<CachedValue<AnalyzeExhaust>> ANALYZE_EXHAUST_HEADERS = Key.create("ANALYZE_EXHAUST_HEADERS"); private final static Key<CachedValue<AnalyzeExhaust>> ANALYZE_EXHAUST_HEADERS = Key.create("ANALYZE_EXHAUST_HEADERS");
private final static Key<CachedValue<AnalyzeExhaust>> ANALYZE_EXHAUST_FULL = Key.create("ANALYZE_EXHAUST_FULL"); private final static Key<CachedValue<AnalyzeExhaust>> ANALYZE_EXHAUST_FULL = Key.create("ANALYZE_EXHAUST_FULL");
private final static Key<CachedValue<ResolveSession>> ANALYZE_EXHAUST_LAZY_FULL = Key.create("ANALYZE_EXHAUST_FULL");
private static final Object lock = new Object(); private static final Object lock = new Object();
public static final Function<JetFile, Collection<JetFile>> SINGLE_DECLARATION_PROVIDER = new Function<JetFile, Collection<JetFile>>() { public static final Function<JetFile, Collection<JetFile>> SINGLE_DECLARATION_PROVIDER = new Function<JetFile, Collection<JetFile>>() {
@@ -182,24 +181,14 @@ public final class AnalyzerFacadeWithCache {
LOG.error(e); LOG.error(e);
} }
private static final Object lazyLock = new Object();
@NotNull @NotNull
public static ResolveSession getLazyResolveSession(@NotNull final JetFile file) { public static ResolveSession getLazyResolveSession(@NotNull final JetFile file) {
synchronized (lazyLock) {
final Project fileProject = file.getProject(); final Project fileProject = file.getProject();
CachedValue<ResolveSession> bindingContextCachedValue = file.getUserData(ANALYZE_EXHAUST_LAZY_FULL);
if (bindingContextCachedValue == null) {
bindingContextCachedValue =
CachedValuesManager.getManager(file.getProject()).createCachedValue(new CachedValueProvider<ResolveSession>() {
@Override
public Result<ResolveSession> compute() {
ApplicationUtils.warnTimeConsuming(LOG);
ModuleDescriptor javaModule = new ModuleDescriptor(Name.special("<java module>")); ModuleDescriptor javaModule = new ModuleDescriptor(Name.special("<java module>"));
BindingTraceContext javaResolverTrace = new BindingTraceContext();
InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver( InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver(
fileProject, new BindingTraceContext(), javaModule, BuiltinsScopeExtensionMode.ALL); fileProject, javaResolverTrace, javaModule, BuiltinsScopeExtensionMode.ALL);
Collection<JetFile> files = JetFilesProvider.getInstance(fileProject).allInScope(GlobalSearchScope.allScope(fileProject)); Collection<JetFile> files = JetFilesProvider.getInstance(fileProject).allInScope(GlobalSearchScope.allScope(fileProject));
@@ -250,14 +239,7 @@ public final class AnalyzerFacadeWithCache {
}; };
ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("<lazy module>")); ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("<lazy module>"));
ResolveSession resolveSession = new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory);
return new Result<ResolveSession>(resolveSession, PsiModificationTracker.MODIFICATION_COUNT); return new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory);
}
}, false);
file.putUserData(ANALYZE_EXHAUST_LAZY_FULL, bindingContextCachedValue);
}
return bindingContextCachedValue.getValue();
}
} }
} }