mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
extract LibraryScopeCache out of ProjectRootManagerImpl
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.openapi.roots.impl;
|
||||
|
||||
import com.intellij.openapi.components.ServiceManager;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.impl.scopes.JdkScope;
|
||||
import com.intellij.openapi.module.impl.scopes.LibraryRuntimeClasspathScope;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.JdkOrderEntry;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.util.ConcurrencyUtil;
|
||||
import com.intellij.util.containers.ConcurrentHashMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public class LibraryScopeCache {
|
||||
public static LibraryScopeCache getInstance(Project project) {
|
||||
return ServiceManager.getService(project, LibraryScopeCache.class);
|
||||
}
|
||||
|
||||
private final Project myProject;
|
||||
private final ConcurrentMap<List<Module>, GlobalSearchScope> myLibraryScopes = new ConcurrentHashMap<List<Module>, GlobalSearchScope>();
|
||||
private final ConcurrentMap<String, GlobalSearchScope> mySdkScopes = new ConcurrentHashMap<String, GlobalSearchScope>();
|
||||
|
||||
public LibraryScopeCache(Project project) {
|
||||
myProject = project;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
myLibraryScopes.clear();
|
||||
mySdkScopes.clear();
|
||||
}
|
||||
|
||||
public GlobalSearchScope getScopeForLibraryUsedIn(List<Module> modulesLibraryIsUsedIn) {
|
||||
GlobalSearchScope scope = myLibraryScopes.get(modulesLibraryIsUsedIn);
|
||||
if (scope != null) {
|
||||
return scope;
|
||||
}
|
||||
GlobalSearchScope newScope = modulesLibraryIsUsedIn.isEmpty()
|
||||
? new LibrariesOnlyScope(GlobalSearchScope.allScope(myProject))
|
||||
: new LibraryRuntimeClasspathScope(myProject, modulesLibraryIsUsedIn);
|
||||
return ConcurrencyUtil.cacheOrGet(myLibraryScopes, modulesLibraryIsUsedIn, newScope);
|
||||
}
|
||||
|
||||
public GlobalSearchScope getScopeForSdk(final JdkOrderEntry jdkOrderEntry) {
|
||||
final String jdk = jdkOrderEntry.getJdkName();
|
||||
if (jdk == null) return GlobalSearchScope.allScope(myProject);
|
||||
GlobalSearchScope scope = mySdkScopes.get(jdk);
|
||||
if (scope == null) {
|
||||
return ConcurrencyUtil.cacheOrGet(mySdkScopes, jdk, new JdkScope(myProject, jdkOrderEntry));
|
||||
}
|
||||
return scope;
|
||||
}
|
||||
|
||||
private static class LibrariesOnlyScope extends GlobalSearchScope {
|
||||
private final GlobalSearchScope myOriginal;
|
||||
|
||||
private LibrariesOnlyScope(final GlobalSearchScope original) {
|
||||
super(original.getProject());
|
||||
myOriginal = original;
|
||||
}
|
||||
|
||||
public boolean contains(VirtualFile file) {
|
||||
return myOriginal.contains(file);
|
||||
}
|
||||
|
||||
public int compare(VirtualFile file1, VirtualFile file2) {
|
||||
return myOriginal.compare(file1, file2);
|
||||
}
|
||||
|
||||
public boolean isSearchInModuleContent(@NotNull Module aModule) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isSearchInLibraries() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+16
@@ -27,6 +27,7 @@ import com.intellij.openapi.fileTypes.FileTypeListener;
|
||||
import com.intellij.openapi.fileTypes.FileTypeManager;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleManager;
|
||||
import com.intellij.openapi.module.impl.ModuleImpl;
|
||||
import com.intellij.openapi.project.DumbServiceImpl;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.*;
|
||||
@@ -269,6 +270,21 @@ public class ProjectRootManagerComponent extends ProjectRootManagerImpl {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void clearScopesCaches() {
|
||||
super.clearScopesCaches();
|
||||
LibraryScopeCache.getInstance(myProject).clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearScopesCachesForModules() {
|
||||
super.clearScopesCachesForModules();
|
||||
Module[] modules = ModuleManager.getInstance(myProject).getModules();
|
||||
for (Module module : modules) {
|
||||
((ModuleImpl)module).clearScopesCache();
|
||||
}
|
||||
}
|
||||
|
||||
private class AppListener extends ApplicationAdapter {
|
||||
public void beforeWriteActionStart(Object action) {
|
||||
myInsideRefresh++;
|
||||
|
||||
@@ -24,9 +24,6 @@ import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleManager;
|
||||
import com.intellij.openapi.module.impl.ModuleImpl;
|
||||
import com.intellij.openapi.module.impl.scopes.JdkScope;
|
||||
import com.intellij.openapi.module.impl.scopes.LibraryRuntimeClasspathScope;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.projectRoots.ProjectJdkTable;
|
||||
import com.intellij.openapi.projectRoots.Sdk;
|
||||
@@ -43,10 +40,7 @@ import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.impl.PsiModificationTrackerImpl;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.util.ConcurrencyUtil;
|
||||
import com.intellij.util.EventDispatcher;
|
||||
import com.intellij.util.containers.ConcurrentHashMap;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.HashMap;
|
||||
import com.intellij.util.containers.HashSet;
|
||||
@@ -56,7 +50,6 @@ import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
/**
|
||||
* @author max
|
||||
@@ -77,8 +70,6 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
|
||||
private long myModificationCount = 0;
|
||||
@NonNls private static final String ATTRIBUTE_VERSION = "version";
|
||||
|
||||
private final ConcurrentMap<List<Module>, GlobalSearchScope> myLibraryScopes = new ConcurrentHashMap<List<Module>, GlobalSearchScope>();
|
||||
private final ConcurrentMap<String, GlobalSearchScope> myJdkScopes = new ConcurrentHashMap<String, GlobalSearchScope>();
|
||||
private final OrderRootsCache myRootsCache;
|
||||
|
||||
protected boolean myStartupActivityPerformed = false;
|
||||
@@ -350,8 +341,6 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
|
||||
|
||||
protected void clearScopesCaches() {
|
||||
clearScopesCachesForModules();
|
||||
myJdkScopes.clear();
|
||||
myLibraryScopes.clear();
|
||||
}
|
||||
|
||||
public void clearScopesCachesForModules() {
|
||||
@@ -359,7 +348,6 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
|
||||
Module[] modules = ModuleManager.getInstance(myProject).getModules();
|
||||
for (Module module : modules) {
|
||||
((ModuleRootManagerImpl)ModuleRootManager.getInstance(module)).dropCaches();
|
||||
((ModuleImpl)module).clearScopesCache();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -456,52 +444,6 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
|
||||
return myProject;
|
||||
}
|
||||
|
||||
private static class LibrariesOnlyScope extends GlobalSearchScope {
|
||||
private final GlobalSearchScope myOriginal;
|
||||
|
||||
private LibrariesOnlyScope(final GlobalSearchScope original) {
|
||||
super(original.getProject());
|
||||
myOriginal = original;
|
||||
}
|
||||
|
||||
public boolean contains(VirtualFile file) {
|
||||
return myOriginal.contains(file);
|
||||
}
|
||||
|
||||
public int compare(VirtualFile file1, VirtualFile file2) {
|
||||
return myOriginal.compare(file1, file2);
|
||||
}
|
||||
|
||||
public boolean isSearchInModuleContent(@NotNull Module aModule) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isSearchInLibraries() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public GlobalSearchScope getScopeForLibraryUsedIn(List<Module> modulesLibraryIsUsedIn) {
|
||||
GlobalSearchScope scope = myLibraryScopes.get(modulesLibraryIsUsedIn);
|
||||
if (scope != null) {
|
||||
return scope;
|
||||
}
|
||||
GlobalSearchScope newScope = modulesLibraryIsUsedIn.isEmpty()
|
||||
? new LibrariesOnlyScope(GlobalSearchScope.allScope(myProject))
|
||||
: new LibraryRuntimeClasspathScope(myProject, modulesLibraryIsUsedIn);
|
||||
return ConcurrencyUtil.cacheOrGet(myLibraryScopes, modulesLibraryIsUsedIn, newScope);
|
||||
}
|
||||
|
||||
public GlobalSearchScope getScopeForJdk(final JdkOrderEntry jdkOrderEntry) {
|
||||
final String jdk = jdkOrderEntry.getJdkName();
|
||||
if (jdk == null) return GlobalSearchScope.allScope(myProject);
|
||||
GlobalSearchScope scope = myJdkScopes.get(jdk);
|
||||
if (scope == null) {
|
||||
return ConcurrencyUtil.cacheOrGet(myJdkScopes,jdk, new JdkScope(myProject, jdkOrderEntry));
|
||||
}
|
||||
return scope;
|
||||
}
|
||||
|
||||
protected void doSynchronizeRoots() {
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ import com.intellij.openapi.module.impl.scopes.LibraryRuntimeClasspathScope;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.*;
|
||||
import com.intellij.openapi.roots.ex.ProjectRootManagerEx;
|
||||
import com.intellij.openapi.roots.impl.LibraryScopeCache;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.PsiManagerImpl;
|
||||
@@ -99,7 +99,7 @@ public class ResolveScopeManagerImpl extends ResolveScopeManager {
|
||||
ProgressManager.checkCanceled();
|
||||
|
||||
if (entry instanceof JdkOrderEntry) {
|
||||
return ((ProjectRootManagerEx)myProjectRootManager).getScopeForJdk((JdkOrderEntry)entry);
|
||||
return LibraryScopeCache.getInstance(myProject).getScopeForSdk((JdkOrderEntry)entry);
|
||||
}
|
||||
|
||||
if (entry instanceof LibraryOrderEntry) {
|
||||
@@ -111,7 +111,7 @@ public class ResolveScopeManagerImpl extends ResolveScopeManager {
|
||||
}
|
||||
}
|
||||
|
||||
GlobalSearchScope allCandidates = ((ProjectRootManagerEx)myProjectRootManager).getScopeForLibraryUsedIn(modulesLibraryUsedIn);
|
||||
GlobalSearchScope allCandidates = LibraryScopeCache.getInstance(myProject).getScopeForLibraryUsedIn(modulesLibraryUsedIn);
|
||||
if (lib != null) {
|
||||
final LibraryRuntimeClasspathScope preferred = new LibraryRuntimeClasspathScope(myProject, lib);
|
||||
// prefer current library
|
||||
|
||||
@@ -305,6 +305,9 @@
|
||||
<projectService serviceInterface="com.intellij.ui.FileColorManager"
|
||||
serviceImplementation="com.intellij.ui.tabs.FileColorManagerImpl"/>
|
||||
|
||||
<projectService serviceInterface="com.intellij.openapi.roots.impl.LibraryScopeCache"
|
||||
serviceImplementation="com.intellij.openapi.roots.impl.LibraryScopeCache"/>
|
||||
|
||||
<colorSettingsPage implementation="com.intellij.openapi.options.colors.pages.GeneralColorsPage" id="general"/>
|
||||
<colorSettingsPage implementation="com.intellij.openapi.options.colors.pages.ANSIColoredConsoleColorsPage" id="general"/>
|
||||
<colorSettingsPage implementation="com.intellij.openapi.options.colors.pages.CustomColorsPage" id="custom"/>
|
||||
|
||||
@@ -16,15 +16,11 @@
|
||||
|
||||
package com.intellij.openapi.roots.ex;
|
||||
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.JdkOrderEntry;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.EventListener;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class ProjectRootManagerEx extends ProjectRootManager {
|
||||
public static ProjectRootManagerEx getInstanceEx(Project project) {
|
||||
@@ -40,10 +36,6 @@ public abstract class ProjectRootManagerEx extends ProjectRootManager {
|
||||
|
||||
public abstract void mergeRootsChangesDuring(@NotNull Runnable runnable);
|
||||
|
||||
public abstract GlobalSearchScope getScopeForLibraryUsedIn(List<Module> modulesLibraryIsUsedIn);
|
||||
|
||||
public abstract GlobalSearchScope getScopeForJdk(final JdkOrderEntry jdkOrderEntry);
|
||||
|
||||
public abstract void clearScopesCachesForModules();
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user