From c2822fdad71a43e21df9ca181f74c48c151d438b Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 28 Jan 2013 21:37:33 +0400 Subject: [PATCH] Declaration providers and resolve session are protected by a storage manager --- .../resolve/java/AnalyzerFacadeForJVM.java | 6 +- .../AbstractPsiBasedDeclarationProvider.java | 88 ++++++++++--------- .../FileBasedDeclarationProviderFactory.java | 79 ++++++++++------- ...BasedPackageMemberDeclarationProvider.java | 28 +++--- ...siBasedClassMemberDeclarationProvider.java | 9 +- .../jet/lang/resolve/lazy/ResolveSession.java | 8 +- .../jet/lang/types/lang/KotlinBuiltIns.java | 5 +- ...ractLazyResolveDescriptorRendererTest.java | 5 +- .../resolve/lazy/LazyResolveTestUtil.java | 5 +- .../libraries/JetSourceNavigationHelper.java | 5 +- .../StubDeclarationProviderFactory.java | 11 ++- .../k2js/analyze/AnalyzerFacadeForJS.java | 6 +- 12 files changed, 147 insertions(+), 108 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java index b827d69de4296..779a9fd77be7b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java @@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.lazy.FileBasedDeclarationProviderFactory; +import org.jetbrains.jet.lang.resolve.lazy.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -90,7 +91,8 @@ public ResolveSession getLazyResolveSession(@NotNull final Project fileProject, final PsiClassFinder psiClassFinder = injector.getPsiClassFinder(); // TODO: Replace with stub declaration provider - final FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(files, new Predicate() { + LockBasedStorageManager storageManager = new LockBasedStorageManager(); + final FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(storageManager, files, new Predicate() { @Override public boolean apply(FqName fqName) { return psiClassFinder.findPsiPackage(fqName) != null || new FqName("jet").equals(fqName); @@ -136,7 +138,7 @@ public PlatformToKotlinClassMap getPlatformToKotlinClassMap() { ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); - return new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory, javaResolverTrace); + return new ResolveSession(fileProject, storageManager, lazyModule, moduleConfiguration, declarationProviderFactory, javaResolverTrace); } public static AnalyzeExhaust analyzeOneFileWithJavaIntegrationAndCheckForErrors( diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractPsiBasedDeclarationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractPsiBasedDeclarationProvider.java index abe3948de4d54..170640e538cd4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractPsiBasedDeclarationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractPsiBasedDeclarationProvider.java @@ -20,6 +20,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; +import com.intellij.openapi.util.Computable; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.name.Name; @@ -30,71 +31,76 @@ import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve; public abstract class AbstractPsiBasedDeclarationProvider implements DeclarationProvider { - private final List allDeclarations = Lists.newArrayList(); - private final Multimap functions = HashMultimap.create(); - private final Multimap properties = HashMultimap.create(); - private final Multimap classesAndObjects = ArrayListMultimap.create(); // order matters here - private boolean indexCreated = false; + protected static class Index { + // This mutable state is only modified under inside the computable + private final List allDeclarations = Lists.newArrayList(); + private final Multimap functions = HashMultimap.create(); + private final Multimap properties = HashMultimap.create(); + private final Multimap classesAndObjects = ArrayListMultimap.create(); // order matters here - protected final void createIndex() { - if (indexCreated) return; - indexCreated = true; + public void putToIndex(@NotNull JetDeclaration declaration) { + if (declaration instanceof JetClassInitializer) { + return; + } + allDeclarations.add(declaration); + if (declaration instanceof JetNamedFunction) { + JetNamedFunction namedFunction = (JetNamedFunction) declaration; + functions.put(safeNameForLazyResolve(namedFunction), namedFunction); + } + else if (declaration instanceof JetProperty) { + JetProperty property = (JetProperty) declaration; + properties.put(safeNameForLazyResolve(property), property); + } + else if (declaration instanceof JetClassOrObject) { + JetClassOrObject classOrObject = (JetClassOrObject) declaration; + classesAndObjects.put(safeNameForLazyResolve(classOrObject.getNameAsName()), classOrObject); + } + else if (declaration instanceof JetParameter || declaration instanceof JetTypedef || declaration instanceof JetMultiDeclaration) { + // Do nothing, just put it into allDeclarations is enough + } + else { + throw new IllegalArgumentException("Unknown declaration: " + declaration); + } + } - doCreateIndex(); } - protected abstract void doCreateIndex(); + private final LazyValue index; - protected void putToIndex(JetDeclaration declaration) { - if (declaration instanceof JetClassInitializer) { - return; - } - allDeclarations.add(declaration); - if (declaration instanceof JetNamedFunction) { - JetNamedFunction namedFunction = (JetNamedFunction) declaration; - functions.put(safeNameForLazyResolve(namedFunction), namedFunction); - } - else if (declaration instanceof JetProperty) { - JetProperty property = (JetProperty) declaration; - properties.put(safeNameForLazyResolve(property), property); - } - else if (declaration instanceof JetClassOrObject) { - JetClassOrObject classOrObject = (JetClassOrObject) declaration; - classesAndObjects.put(safeNameForLazyResolve(classOrObject.getNameAsName()), classOrObject); - } - else if (declaration instanceof JetParameter || declaration instanceof JetTypedef || declaration instanceof JetMultiDeclaration) { - // Do nothing, just put it into allDeclarations is enough - } - else { - throw new IllegalArgumentException("Unknown declaration: " + declaration); - } + public AbstractPsiBasedDeclarationProvider(@NotNull StorageManager storageManager) { + index = storageManager.createLazyValue(new Computable() { + @Override + public Index compute() { + Index index = new Index(); + doCreateIndex(index); + return index; + } + }); } + protected abstract void doCreateIndex(@NotNull Index index); + @Override public List getAllDeclarations() { - createIndex(); - return allDeclarations; + return index.get().allDeclarations; } @NotNull @Override public List getFunctionDeclarations(@NotNull Name name) { - createIndex(); - return Lists.newArrayList(functions.get(name)); + return Lists.newArrayList(index.get().functions.get(name)); } @NotNull @Override public List getPropertyDeclarations(@NotNull Name name) { - createIndex(); - return Lists.newArrayList(properties.get(name)); + return Lists.newArrayList(index.get().properties.get(name)); } @NotNull @Override public Collection getClassOrObjectDeclarations(@NotNull Name name) { - createIndex(); - return classesAndObjects.get(name); + return index.get().classesAndObjects.get(name); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedDeclarationProviderFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedDeclarationProviderFactory.java index 6ec59fc4527af..a7a49270f4656 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedDeclarationProviderFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedDeclarationProviderFactory.java @@ -18,7 +18,11 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.*; +import com.google.common.collect.Collections2; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; +import com.intellij.openapi.util.Computable; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamespaceHeader; @@ -26,56 +30,68 @@ import org.jetbrains.jet.lang.resolve.name.FqName; import java.util.Collection; -import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentMap; public class FileBasedDeclarationProviderFactory implements DeclarationProviderFactory { - private final Collection allFiles; - - private final Multimap filesByPackage = HashMultimap.create(); - private final Set declaredPackages = Sets.newHashSet(); - private final Map packageDeclarationProviders = Maps.newHashMap(); + private static class Index { + private final Multimap filesByPackage = HashMultimap.create(); + private final Set declaredPackages = Sets.newHashSet(); + } private final Predicate isPackageDeclaredExternally; - private boolean indexed = false; + private final StorageManager storageManager; + private final LazyValue index; + + private final ConcurrentMap packageDeclarationProviders; - public FileBasedDeclarationProviderFactory(@NotNull Collection files) { - this(files, Predicates.alwaysFalse()); + public FileBasedDeclarationProviderFactory(@NotNull StorageManager storageManager, @NotNull Collection files) { + this(storageManager, files, Predicates.alwaysFalse()); } - public FileBasedDeclarationProviderFactory(@NotNull Collection files, Predicate isPackageDeclaredExternally) { - this.allFiles = files; + public FileBasedDeclarationProviderFactory( + @NotNull StorageManager storageManager, + @NotNull final Collection files, + @NotNull Predicate isPackageDeclaredExternally + ) { + this.storageManager = storageManager; this.isPackageDeclaredExternally = isPackageDeclaredExternally; + this.index = storageManager.createLazyValue(new Computable() { + @Override + public Index compute() { + return computeFilesByPackage(files); + } + }); + this.packageDeclarationProviders = storageManager.createConcurrentMap(); } - private void createIndex() { - if (indexed) return; - indexed = true; - - for (JetFile file : allFiles) { + @NotNull + private static Index computeFilesByPackage(@NotNull Collection files) { + Index index = new Index(); + for (JetFile file : files) { JetNamespaceHeader header = file.getNamespaceHeader(); if (header == null) { throw new IllegalArgumentException("Scripts are not supported"); } FqName packageFqName = new FqName(header.getQualifiedName()); - addMeAndParentPackages(packageFqName); - filesByPackage.put(packageFqName, file); + addMeAndParentPackages(index, packageFqName); + index.filesByPackage.put(packageFqName, file); } + return index; } - private void addMeAndParentPackages(@NotNull FqName name) { - declaredPackages.add(name); + private static void addMeAndParentPackages(@NotNull Index index, @NotNull FqName name) { + index.declaredPackages.add(name); if (!name.isRoot()) { - addMeAndParentPackages(name.parent()); + addMeAndParentPackages(index, name.parent()); } } /*package*/ boolean isPackageDeclaredExplicitly(@NotNull FqName packageFqName) { - createIndex(); - return declaredPackages.contains(packageFqName); + return index.get().declaredPackages.contains(packageFqName); } /*package*/ boolean isPackageDeclared(@NotNull FqName packageFqName) { @@ -83,7 +99,7 @@ private void addMeAndParentPackages(@NotNull FqName name) { } /*package*/ Collection getAllDeclaredSubPackagesOf(@NotNull final FqName parent) { - return Collections2.filter(declaredPackages, new Predicate() { + return Collections2.filter(index.get().declaredPackages, new Predicate() { @Override public boolean apply(FqName fqName) { return !fqName.isRoot() && fqName.parent().equals(parent); @@ -93,8 +109,6 @@ public boolean apply(FqName fqName) { @Override public PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName) { - createIndex(); - PackageMemberDeclarationProvider declarationProvider = packageDeclarationProviders.get(packageFqName); if (declarationProvider != null) { return declarationProvider; @@ -108,21 +122,18 @@ public PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@Not } FileBasedPackageMemberDeclarationProvider provider = - new FileBasedPackageMemberDeclarationProvider(packageFqName, this, filesByPackage.get(packageFqName)); - packageDeclarationProviders.put(packageFqName, provider); + new FileBasedPackageMemberDeclarationProvider(storageManager, packageFqName, this, index.get().filesByPackage.get(packageFqName)); - return provider; + return packageDeclarationProviders.putIfAbsent(packageFqName, provider); } @NotNull @Override public ClassMemberDeclarationProvider getClassMemberDeclarationProvider(@NotNull JetClassLikeInfo classLikeInfo) { - createIndex(); - - if (!filesByPackage.containsKey(classLikeInfo.getContainingPackageFqName())) { + if (!index.get().filesByPackage.containsKey(classLikeInfo.getContainingPackageFqName())) { throw new IllegalStateException("This factory doesn't know about this class: " + classLikeInfo); } - return new PsiBasedClassMemberDeclarationProvider(classLikeInfo); + return new PsiBasedClassMemberDeclarationProvider(storageManager, classLikeInfo); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedPackageMemberDeclarationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedPackageMemberDeclarationProvider.java index e355686e3101c..faf9c469318c7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedPackageMemberDeclarationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/FileBasedPackageMemberDeclarationProvider.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.resolve.lazy; +import com.intellij.openapi.util.Computable; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -28,24 +29,32 @@ public class FileBasedPackageMemberDeclarationProvider extends AbstractPsiBasedD private final FqName fqName; private final FileBasedDeclarationProviderFactory factory; private final Collection allFiles; - private Collection allDeclaredPackages; + private final LazyValue> allDeclaredPackages; /*package*/ FileBasedPackageMemberDeclarationProvider( - @NotNull FqName fqName, - @NotNull FileBasedDeclarationProviderFactory factory, + @NotNull StorageManager storageManager, + @NotNull FqName _fqName, + @NotNull FileBasedDeclarationProviderFactory _factory, @NotNull Collection allFiles ) { - this.fqName = fqName; - this.factory = factory; + super(storageManager); + this.fqName = _fqName; + this.factory = _factory; this.allFiles = allFiles; + this.allDeclaredPackages = storageManager.createLazyValue(new Computable>() { + @Override + public Collection compute() { + return factory.getAllDeclaredSubPackagesOf(fqName); + } + }); } @Override - protected void doCreateIndex() { + protected void doCreateIndex(@NotNull Index index) { for (JetFile file : allFiles) { for (JetDeclaration declaration : file.getDeclarations()) { - putToIndex(declaration); + index.putToIndex(declaration); } } } @@ -57,10 +66,7 @@ public boolean isPackageDeclared(@NotNull Name name) { @Override public Collection getAllDeclaredPackages() { - if (allDeclaredPackages == null) { - allDeclaredPackages = factory.getAllDeclaredSubPackagesOf(fqName); - } - return allDeclaredPackages; + return allDeclaredPackages.get(); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/PsiBasedClassMemberDeclarationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/PsiBasedClassMemberDeclarationProvider.java index d0675aafa1478..40b5f3c592fcc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/PsiBasedClassMemberDeclarationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/PsiBasedClassMemberDeclarationProvider.java @@ -24,7 +24,8 @@ public class PsiBasedClassMemberDeclarationProvider extends AbstractPsiBasedDecl private final JetClassLikeInfo classInfo; - public PsiBasedClassMemberDeclarationProvider(@NotNull JetClassLikeInfo classInfo) { + public PsiBasedClassMemberDeclarationProvider(@NotNull StorageManager storageManager, @NotNull JetClassLikeInfo classInfo) { + super(storageManager); this.classInfo = classInfo; } @@ -35,19 +36,19 @@ public JetClassLikeInfo getOwnerInfo() { } @Override - protected void doCreateIndex() { + protected void doCreateIndex(@NotNull Index index) { for (JetDeclaration declaration : classInfo.getDeclarations()) { if (declaration instanceof JetClassObject) { // Do nothing, class object will be taken directly from the classInfo } else { - putToIndex(declaration); + index.putToIndex(declaration); } } for (JetParameter parameter : classInfo.getPrimaryConstructorParameters()) { if (parameter.getValOrVarNode() != null) { - putToIndex(parameter); + index.putToIndex(parameter); } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java index 95730f40dcaad..97a27ac3acfc0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java @@ -65,23 +65,26 @@ public Name fun(FqName name) { public ResolveSession( @NotNull Project project, + @NotNull StorageManager storageManager, @NotNull ModuleDescriptor rootDescriptor, @NotNull ModuleConfiguration moduleConfiguration, @NotNull DeclarationProviderFactory declarationProviderFactory ) { - this(project, rootDescriptor, moduleConfiguration, declarationProviderFactory, NO_ALIASES, + this(project, storageManager, rootDescriptor, moduleConfiguration, declarationProviderFactory, NO_ALIASES, Predicates.alwaysFalse(), new BindingTraceContext()); } public ResolveSession( @NotNull Project project, + @NotNull StorageManager storageManager, @NotNull ModuleDescriptor rootDescriptor, @NotNull ModuleConfiguration moduleConfiguration, @NotNull DeclarationProviderFactory declarationProviderFactory, @NotNull BindingTrace delegationTrace ) { this(project, + storageManager, rootDescriptor, moduleConfiguration, declarationProviderFactory, @@ -93,6 +96,7 @@ public ResolveSession( @Deprecated // Internal use only public ResolveSession( @NotNull Project project, + @NotNull StorageManager storageManager, @NotNull ModuleDescriptor rootDescriptor, @NotNull ModuleConfiguration moduleConfiguration, @NotNull DeclarationProviderFactory declarationProviderFactory, @@ -100,7 +104,7 @@ public ResolveSession( @NotNull Predicate specialClasses, @NotNull BindingTrace delegationTrace ) { - this.storageManager = new LockBasedStorageManager(); + this.storageManager = storageManager; this.classifierAliases = classifierAliases; this.specialClasses = specialClasses; this.trace = new ObservableBindingTrace(delegationTrace); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java index 084652978822b..841d41c599e04 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java @@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.lazy.FileBasedDeclarationProviderFactory; +import org.jetbrains.jet.lang.resolve.lazy.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; @@ -221,11 +222,13 @@ private void initialize() { @NotNull private ResolveSession createLazyResolveSession(@NotNull Project project) throws IOException { List files = loadResourcesAsJetFiles(project, LIBRARY_FILES); + LockBasedStorageManager storageManager = new LockBasedStorageManager(); return new ResolveSession( project, + storageManager, builtInsModule, new SpecialModuleConfiguration(project), - new FileBasedDeclarationProviderFactory(files), + new FileBasedDeclarationProviderFactory(storageManager, files), new Function() { @Override public Name fun(FqName name) { diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveDescriptorRendererTest.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveDescriptorRendererTest.java index a7e4fbdef22e7..92ac4673a3522 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveDescriptorRendererTest.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyResolveDescriptorRendererTest.java @@ -53,8 +53,9 @@ protected void doTest(@NotNull String testFile) throws IOException { Collection files = Lists.newArrayList(psiFile); ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); - final ResolveSession resolveSession = new ResolveSession(getProject(), lazyModule, injectorForTopDownAnalyzer.getModuleConfiguration(), - new FileBasedDeclarationProviderFactory(files)); + LockBasedStorageManager storageManager = new LockBasedStorageManager(); + final ResolveSession resolveSession = new ResolveSession(getProject(), storageManager, lazyModule, injectorForTopDownAnalyzer.getModuleConfiguration(), + new FileBasedDeclarationProviderFactory(storageManager, files)); final List descriptors = new ArrayList(); psiFile.accept(new JetVisitorVoid() { diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java index 846d7ddc88988..7e8058fda38ef 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveTestUtil.java @@ -92,7 +92,8 @@ public static ModuleDescriptor resolveLazily(List files, JetCoreEnviron final JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); - final FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(files, new Predicate() { + LockBasedStorageManager storageManager = new LockBasedStorageManager(); + final FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(storageManager, files, new Predicate() { @Override public boolean apply(FqName fqName) { return psiClassFinder.findPsiPackage(fqName) != null || new FqName("jet").equals(fqName); @@ -134,7 +135,7 @@ public PlatformToKotlinClassMap getPlatformToKotlinClassMap() { ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); ResolveSession - session = new ResolveSession(project, lazyModule, moduleConfiguration, declarationProviderFactory); + session = new ResolveSession(project, storageManager, lazyModule, moduleConfiguration, declarationProviderFactory); return lazyModule; } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index 3acea572c512d..eaf405bebabc3 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -40,6 +40,7 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.lazy.FileBasedDeclarationProviderFactory; +import org.jetbrains.jet.lang.resolve.lazy.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -198,7 +199,8 @@ else if (decompiledContainer instanceof JetClassBody) { } Project project = decompiledDeclaration.getProject(); - FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(getContainingFiles(candidates), + LockBasedStorageManager storageManager = new LockBasedStorageManager(); + FileBasedDeclarationProviderFactory providerFactory = new FileBasedDeclarationProviderFactory(storageManager, getContainingFiles(candidates), new Predicate() { @Override public boolean apply(@Nullable FqName fqName) { @@ -207,6 +209,7 @@ public boolean apply(@Nullable FqName fqName) { }); ResolveSession resolveSession = new ResolveSession( project, + storageManager, new ModuleDescriptor(Name.special("")), DefaultModuleConfiguration.createStandardConfiguration(project), providerFactory); diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubDeclarationProviderFactory.java b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubDeclarationProviderFactory.java index dbfce11c2afac..e54734b28db8b 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubDeclarationProviderFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubDeclarationProviderFactory.java @@ -19,10 +19,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.resolve.lazy.ClassMemberDeclarationProvider; -import org.jetbrains.jet.lang.resolve.lazy.DeclarationProviderFactory; -import org.jetbrains.jet.lang.resolve.lazy.PackageMemberDeclarationProvider; -import org.jetbrains.jet.lang.resolve.lazy.PsiBasedClassMemberDeclarationProvider; +import org.jetbrains.jet.lang.resolve.lazy.*; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -30,16 +27,18 @@ public class StubDeclarationProviderFactory implements DeclarationProviderFactor private final Project project; private final GlobalSearchScope searchScope; + private final StorageManager storageManager; - public StubDeclarationProviderFactory(@NotNull Project project, @NotNull GlobalSearchScope scope) { + public StubDeclarationProviderFactory(@NotNull Project project, @NotNull GlobalSearchScope scope, @NotNull StorageManager manager) { this.project = project; searchScope = scope; + storageManager = manager; } @NotNull @Override public ClassMemberDeclarationProvider getClassMemberDeclarationProvider(@NotNull JetClassLikeInfo classLikeInfo) { - return new PsiBasedClassMemberDeclarationProvider(classLikeInfo); + return new PsiBasedClassMemberDeclarationProvider(storageManager, classLikeInfo); } @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java index 5e7b751c8175f..7612c4ec77ef5 100644 --- a/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java +++ b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacadeForJS.java @@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.lazy.FileBasedDeclarationProviderFactory; +import org.jetbrains.jet.lang.resolve.lazy.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -139,9 +140,10 @@ public boolean apply(@Nullable PsiFile file) { @NotNull public static ResolveSession getLazyResolveSession(Collection files, final Config config) { + LockBasedStorageManager storageManager = new LockBasedStorageManager(); FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory( - Config.withJsLibAdded(files, config), Predicates.alwaysFalse()); + storageManager, Config.withJsLibAdded(files, config), Predicates.alwaysFalse()); ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); - return new ResolveSession(config.getProject(), lazyModule, new JsConfiguration(config.getProject(), null), declarationProviderFactory); + return new ResolveSession(config.getProject(), storageManager, lazyModule, new JsConfiguration(config.getProject(), null), declarationProviderFactory); } }