mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
cache cls navigation elements that are not so cheap to calculate each time
This commit is contained in:
@@ -27,6 +27,7 @@ import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.fileTypes.FileType;
|
||||
import com.intellij.openapi.progress.NonCancelableSection;
|
||||
import com.intellij.openapi.progress.ProgressIndicatorProvider;
|
||||
import com.intellij.openapi.roots.FileIndexFacade;
|
||||
import com.intellij.openapi.ui.Queryable;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
@@ -44,12 +45,15 @@ import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
import com.intellij.psi.impl.source.tree.TreeElement;
|
||||
import com.intellij.psi.search.PsiElementProcessor;
|
||||
import com.intellij.psi.stubs.*;
|
||||
import com.intellij.psi.util.CachedValueProvider;
|
||||
import com.intellij.psi.util.CachedValuesManager;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.reference.SoftReference;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@@ -263,6 +267,16 @@ public class ClsFileImpl extends ClsRepositoryPsiElement<PsiClassHolderFileStub>
|
||||
@Override
|
||||
@NotNull
|
||||
public PsiElement getNavigationElement() {
|
||||
return CachedValuesManager.getCachedValue(this, new CachedValueProvider<PsiElement>() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Result<PsiElement> compute() {
|
||||
return Result.create(calcNavigationElement(), ClsFileImpl.this, FileIndexFacade.getInstance(getProject()).getRootModificationTracker());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private PsiElement calcNavigationElement() {
|
||||
for (ClsCustomNavigationPolicy customNavigationPolicy : Extensions.getExtensions(ClsCustomNavigationPolicy.EP_NAME)) {
|
||||
if (customNavigationPolicy instanceof ClsCustomNavigationPolicyEx) {
|
||||
PsiFile navigationElement = ((ClsCustomNavigationPolicyEx)customNavigationPolicy).getFileNavigationElement(this);
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.intellij.psi.impl.compiled;
|
||||
import com.intellij.navigation.ItemPresentation;
|
||||
import com.intellij.navigation.ItemPresentationProviders;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.roots.FileIndexFacade;
|
||||
import com.intellij.openapi.util.AtomicNotNullLazyValue;
|
||||
import com.intellij.openapi.util.NotNullLazyValue;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
@@ -34,9 +35,7 @@ import com.intellij.psi.impl.source.tree.TreeElement;
|
||||
import com.intellij.psi.scope.PsiScopeProcessor;
|
||||
import com.intellij.psi.scope.util.PsiScopesUtil;
|
||||
import com.intellij.psi.search.SearchScope;
|
||||
import com.intellij.psi.util.MethodSignature;
|
||||
import com.intellij.psi.util.MethodSignatureBackedByPsiMethod;
|
||||
import com.intellij.psi.util.MethodSignatureUtil;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.ui.RowIcon;
|
||||
import com.intellij.util.PlatformIcons;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -280,6 +279,16 @@ public class ClsMethodImpl extends ClsMemberImpl<PsiMethodStub> implements PsiAn
|
||||
|
||||
@Nullable
|
||||
public PsiMethod getSourceMirrorMethod() {
|
||||
return CachedValuesManager.getCachedValue(this, new CachedValueProvider<PsiMethod>() {
|
||||
@Nullable
|
||||
@Override
|
||||
public Result<PsiMethod> compute() {
|
||||
return Result.create(calcSourceMirrorMethod(), getContainingFile(), FileIndexFacade.getInstance(getProject()).getRootModificationTracker());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private PsiMethod calcSourceMirrorMethod() {
|
||||
PsiClass sourceClassMirror = ((ClsClassImpl)getParent()).getSourceMirrorClass();
|
||||
if (sourceClassMirror == null) return null;
|
||||
for (PsiMethod sourceMethod : sourceClassMirror.findMethodsByName(getName(), false)) {
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.intellij.openapi.roots;
|
||||
import com.intellij.openapi.components.ServiceManager;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.ModificationTracker;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -61,4 +62,6 @@ public abstract class FileIndexFacade {
|
||||
public boolean shouldBeFound(GlobalSearchScope scope, VirtualFile virtualFile) {
|
||||
return (scope.isSearchOutsideRootModel() || isInContent(virtualFile) || isInLibrarySource(virtualFile)) && !virtualFile.getFileType().isBinary();
|
||||
}
|
||||
|
||||
@NotNull public abstract ModificationTracker getRootModificationTracker();
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.intellij.mock;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.FileIndexFacade;
|
||||
import com.intellij.openapi.util.ModificationTracker;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -82,6 +83,12 @@ public class MockFileIndexFacade extends FileIndexFacade {
|
||||
return VfsUtilCore.isAncestor(baseDir, child, false);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ModificationTracker getRootModificationTracker() {
|
||||
return ModificationTracker.NEVER_CHANGED;
|
||||
}
|
||||
|
||||
public void addLibraryRoot(VirtualFile file) {
|
||||
myLibraryRoots.add(file);
|
||||
}
|
||||
|
||||
+7
@@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.FileIndexFacade;
|
||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.util.ModificationTracker;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -86,4 +87,10 @@ public class ProjectFileIndexFacade extends FileIndexFacade {
|
||||
childDir = childDir.getParent();
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ModificationTracker getRootModificationTracker() {
|
||||
return ProjectRootManager.getInstance(myProject);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.intellij.openapi.vcs.impl;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.FileIndexFacade;
|
||||
import com.intellij.openapi.util.ModificationTracker;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.platform.ProjectBaseDirectory;
|
||||
@@ -73,6 +74,12 @@ public class DefaultFileIndexFacade extends FileIndexFacade {
|
||||
return VfsUtil.isAncestor(baseDir, childDir, false);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public ModificationTracker getRootModificationTracker() {
|
||||
return ModificationTracker.NEVER_CHANGED;
|
||||
}
|
||||
|
||||
private VirtualFile getBaseDir() {
|
||||
return ProjectBaseDirectory.getInstance(myProject).getBaseDir(myBaseDir);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user