From 2fdcfcfff4b8091e630e07bf2fac19a805f09455 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 4 Sep 2012 14:18:10 +0400 Subject: [PATCH] Don't share lazy resolve session between different clients. It can give slice overwrite exceptions. --- .../project/AnalyzerFacadeWithCache.java | 130 ++++++++---------- 1 file changed, 56 insertions(+), 74 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java b/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java index 868c616a23e..66d147c840d 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java +++ b/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java @@ -68,7 +68,6 @@ public final class AnalyzerFacadeWithCache { private final static Key> ANALYZE_EXHAUST_HEADERS = Key.create("ANALYZE_EXHAUST_HEADERS"); private final static Key> ANALYZE_EXHAUST_FULL = Key.create("ANALYZE_EXHAUST_FULL"); - private final static Key> ANALYZE_EXHAUST_LAZY_FULL = Key.create("ANALYZE_EXHAUST_FULL"); private static final Object lock = new Object(); public static final Function> SINGLE_DECLARATION_PROVIDER = new Function>() { @@ -91,7 +90,7 @@ public final class AnalyzerFacadeWithCache { // TODO: Also need to pass several files when user have multi-file environment @NotNull public static AnalyzeExhaust analyzeFileWithCache(@NotNull final JetFile file, - @NotNull final Function> declarationProvider) { + @NotNull final Function> declarationProvider) { // Need lock for getValue(), because parallel threads can start evaluation of compute() simultaneously synchronized (lock) { CachedValue bindingContextCachedValue = file.getUserData(ANALYZE_EXHAUST_FULL); @@ -164,9 +163,9 @@ public final class AnalyzerFacadeWithCache { public Result compute() { AnalyzeExhaust exhaust = AnalyzerFacadeProvider.getAnalyzerFacadeForFile(fileToCache) .analyzeFiles(fileToCache.getProject(), - declarationProvider.fun(fileToCache), - Collections.emptyList(), - Predicates.alwaysFalse()); + declarationProvider.fun(fileToCache), + Collections.emptyList(), + Predicates.alwaysFalse()); return new Result(exhaust, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); } @@ -182,82 +181,65 @@ public final class AnalyzerFacadeWithCache { LOG.error(e); } - private static final Object lazyLock = new Object(); - @NotNull public static ResolveSession getLazyResolveSession(@NotNull final JetFile file) { - synchronized (lazyLock) { - final Project fileProject = file.getProject(); - CachedValue bindingContextCachedValue = file.getUserData(ANALYZE_EXHAUST_LAZY_FULL); - if (bindingContextCachedValue == null) { - bindingContextCachedValue = - CachedValuesManager.getManager(file.getProject()).createCachedValue(new CachedValueProvider() { - @Override - public Result compute() { - ApplicationUtils.warnTimeConsuming(LOG); + final Project fileProject = file.getProject(); + ModuleDescriptor javaModule = new ModuleDescriptor(Name.special("")); - ModuleDescriptor javaModule = new ModuleDescriptor(Name.special("")); + BindingTraceContext javaResolverTrace = new BindingTraceContext(); + InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver( + fileProject, javaResolverTrace, javaModule, BuiltinsScopeExtensionMode.ALL); - InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver( - fileProject, new BindingTraceContext(), javaModule, BuiltinsScopeExtensionMode.ALL); + Collection files = JetFilesProvider.getInstance(fileProject).allInScope(GlobalSearchScope.allScope(fileProject)); - Collection files = JetFilesProvider.getInstance(fileProject).allInScope(GlobalSearchScope.allScope(fileProject)); + // Given file can differ from the original because it can be a virtual copy with some modifications + JetFile originalFile = (JetFile) file.getOriginalFile(); + files.remove(originalFile); + files.add(file); - // Given file can differ from the original because it can be a virtual copy with some modifications - JetFile originalFile = (JetFile) file.getOriginalFile(); - files.remove(originalFile); - files.add(file); + final PsiClassFinder psiClassFinder = injector.getPsiClassFinder(); - final PsiClassFinder psiClassFinder = injector.getPsiClassFinder(); - - // TODO: Replace with stub declaration provider - final FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(files, new Predicate() { - @Override - public boolean apply(FqName fqName) { - return psiClassFinder.findPsiPackage(fqName) != null || new FqName("jet").equals(fqName); - } - }); - - final JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); - - ModuleConfiguration moduleConfiguration = new ModuleConfiguration() { - @Override - public void addDefaultImports(@NotNull Collection directives) { - final Collection defaultImports = Lists.newArrayList(JavaBridgeConfiguration.DEFAULT_JAVA_IMPORTS); - defaultImports.addAll(Arrays.asList(DefaultModuleConfiguration.DEFAULT_JET_IMPORTS)); - - for (ImportPath defaultJetImport : defaultImports) { - directives.add(JetPsiFactory.createImportDirective(fileProject, defaultJetImport)); - } - } - - @Override - public void extendNamespaceScope( - @NotNull BindingTrace trace, - @NotNull NamespaceDescriptor namespaceDescriptor, - @NotNull WritableScope namespaceMemberScope - ) { - FqName fqName = DescriptorUtils.getFQName(namespaceDescriptor).toSafe(); - if (new FqName("jet").equals(fqName)) { - namespaceMemberScope.importScope(JetStandardLibrary.getInstance().getLibraryScope()); - } - if (psiClassFinder.findPsiPackage(fqName) != null) { - JavaPackageScope javaPackageScope = javaDescriptorResolver.getJavaPackageScope(fqName, namespaceDescriptor); - assert javaPackageScope != null; - namespaceMemberScope.importScope(javaPackageScope); - } - } - }; - - ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); - ResolveSession resolveSession = new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory); - - return new Result(resolveSession, PsiModificationTracker.MODIFICATION_COUNT); - } - }, false); - file.putUserData(ANALYZE_EXHAUST_LAZY_FULL, bindingContextCachedValue); + // TODO: Replace with stub declaration provider + final FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(files, new Predicate() { + @Override + public boolean apply(FqName fqName) { + return psiClassFinder.findPsiPackage(fqName) != null || new FqName("jet").equals(fqName); } - return bindingContextCachedValue.getValue(); - } + }); + + final JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); + + ModuleConfiguration moduleConfiguration = new ModuleConfiguration() { + @Override + public void addDefaultImports(@NotNull Collection directives) { + final Collection defaultImports = Lists.newArrayList(JavaBridgeConfiguration.DEFAULT_JAVA_IMPORTS); + defaultImports.addAll(Arrays.asList(DefaultModuleConfiguration.DEFAULT_JET_IMPORTS)); + + for (ImportPath defaultJetImport : defaultImports) { + directives.add(JetPsiFactory.createImportDirective(fileProject, defaultJetImport)); + } + } + + @Override + public void extendNamespaceScope( + @NotNull BindingTrace trace, + @NotNull NamespaceDescriptor namespaceDescriptor, + @NotNull WritableScope namespaceMemberScope + ) { + FqName fqName = DescriptorUtils.getFQName(namespaceDescriptor).toSafe(); + if (new FqName("jet").equals(fqName)) { + namespaceMemberScope.importScope(JetStandardLibrary.getInstance().getLibraryScope()); + } + if (psiClassFinder.findPsiPackage(fqName) != null) { + JavaPackageScope javaPackageScope = javaDescriptorResolver.getJavaPackageScope(fqName, namespaceDescriptor); + assert javaPackageScope != null; + namespaceMemberScope.importScope(javaPackageScope); + } + } + }; + + ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); + + return new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory); } }