Don't share lazy resolve session between different clients. It can give slice overwrite exceptions.
This commit is contained in:
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user