[java] IJ-CR-159341 IDEA-370304 "Go to Declaration and Usages" seems to leak memory in both IntelliJ 2024.2 and 2024.3 (a lot of memory used by java PSI)

- move `USE_WEAK_FILE_SCOPE` to `GlobalSearchScope`
- IJ-CR-159341

(cherry picked from commit 1e049676158a010d82ac528a15328ea717ba4681)

GitOrigin-RevId: 74c5c4e70f02a3c5b159aff1aa7048daf29bb2d6
This commit is contained in:
Mikhail Pyltsin
2025-04-24 20:37:43 +02:00
committed by intellij-monorepo-bot
parent a8dcad0919
commit 4b11fb634b
4 changed files with 24 additions and 41 deletions

View File

@@ -9,6 +9,7 @@ import com.intellij.psi.*;
import com.intellij.psi.augment.PsiAugmentProvider;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.infos.MethodCandidateInfo;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiTypesUtil;
import com.intellij.psi.util.PsiUtil;
@@ -202,8 +203,7 @@ public final class PsiDiamondTypeUtil {
}
if (copy != null && copy.getContainingFile() != null) {
ResolveScopeManager resolveScopeManager = ResolveScopeManager.getInstance(context.getProject());
resolveScopeManager.markFileForWeakScope(copy.getContainingFile().getViewProvider().getVirtualFile());
GlobalSearchScope.markFileForWeakScope(copy.getContainingFile().getViewProvider().getVirtualFile());
}
final PsiCallExpression exprCopy = PsiTreeUtil.getParentOfType(copy, PsiCallExpression.class, false);
if (context instanceof PsiMethodReferenceExpression) {

View File

@@ -1,10 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.psi.impl.file.impl;
import com.intellij.codeInsight.multiverse.CodeInsightContext;
import com.intellij.codeInsight.multiverse.CodeInsightContextKt;
import com.intellij.codeInsight.multiverse.FileViewProviderUtil;
import com.intellij.codeInsight.multiverse.ModuleContext;
import com.intellij.codeInsight.multiverse.*;
import com.intellij.ide.scratch.ScratchUtil;
import com.intellij.injected.editor.VirtualFileWindow;
import com.intellij.openapi.Disposable;
@@ -17,7 +14,6 @@ import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.TestSourcesFilter;
import com.intellij.openapi.roots.impl.LibraryScopeCache;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileUtil;
@@ -32,7 +28,6 @@ import com.intellij.util.containers.CollectionFactory;
import com.intellij.util.containers.ConcurrentFactoryMap;
import com.intellij.util.indexing.AdditionalIndexableFileSet;
import com.intellij.workspaceModel.core.fileIndex.WorkspaceFileIndex;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -49,8 +44,6 @@ final class ResolveScopeManagerImpl extends ResolveScopeManager implements Dispo
private final Map<Pair<VirtualFile, CodeInsightContext>, GlobalSearchScope> myDefaultResolveScopesCache;
private final AdditionalIndexableFileSet myAdditionalIndexableFileSet;
private static final Key<Boolean> USE_WEAK_FILE_SCOPE = Key.create("virtual.file.use.weak.scope");
ResolveScopeManagerImpl(Project project) {
myProject = project;
myProjectRootManager = ProjectRootManager.getInstance(project);
@@ -91,12 +84,7 @@ final class ResolveScopeManagerImpl extends ResolveScopeManager implements Dispo
}
}
if (original != null && !scope.contains(key.first)) {
if (key.first.getUserData(USE_WEAK_FILE_SCOPE) == Boolean.TRUE) {
scope = scope.union(GlobalSearchScope.fileWeakScope(myProject, key.first, null));
}
else {
scope = scope.union(GlobalSearchScope.fileScope(myProject, key.first));
}
scope = scope.union(GlobalSearchScope.fileScope(myProject, key.first));
}
return scope;
}
@@ -242,13 +230,6 @@ final class ResolveScopeManagerImpl extends ResolveScopeManager implements Dispo
return projectFileIndex.getModuleForFile(notNullVFile);
}
@ApiStatus.Experimental
@ApiStatus.Internal
@Override
public void markFileForWeakScope(@NotNull VirtualFile file) {
file.putUserData(USE_WEAK_FILE_SCOPE, Boolean.TRUE);
}
@Override
public void dispose() {

View File

@@ -6,6 +6,7 @@ import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.UnloadedModuleDescription;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
@@ -28,6 +29,7 @@ import java.util.function.Supplier;
public abstract class GlobalSearchScope extends SearchScope implements ProjectAwareFileFilter {
public static final GlobalSearchScope[] EMPTY_ARRAY = new GlobalSearchScope[0];
private final Project myProject;
private static final Key<Boolean> USE_WEAK_FILE_SCOPE = Key.create("virtual.file.use.weak.scope");
protected GlobalSearchScope(@Nullable Project project) {
myProject = project;
@@ -244,15 +246,15 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
}
@Contract(pure = true)
public static @NotNull GlobalSearchScope fileScope(@NotNull Project project, @Nullable VirtualFile virtualFile, final @Nullable @Nls String displayName) {
public static @NotNull GlobalSearchScope fileScope(@NotNull Project project,
@Nullable VirtualFile virtualFile,
final @Nullable @Nls String displayName) {
if (virtualFile != null && virtualFile.getUserData(USE_WEAK_FILE_SCOPE) == Boolean.TRUE) {
return new FileWeakScope(project, virtualFile, displayName);
}
return new FileScope(project, virtualFile, displayName);
}
@ApiStatus.Internal
@Contract(pure = true)
public static @NotNull GlobalSearchScope fileWeakScope(@NotNull Project project, @NotNull VirtualFile virtualFile, final @Nullable @Nls String displayName) {
return new FileWeakScope(project, virtualFile, displayName);
}
/**
* Please consider using {@link #filesWithLibrariesScope} or {@link #filesWithoutLibrariesScope} for optimization
@@ -318,6 +320,18 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
return new FileTypeRestrictionScope(scope, fileTypes);
}
/**
* Marks a specified file to use a weak file scope. This is useful for modifying
* the scoping mechanism of a file to ensure it is treated under weaker constraints
* than the default resolve scope. It can be used to improve memory consumption.
*
* @param file the virtual file to be marked for weak scope; must not be null
*/
@ApiStatus.Internal
public static void markFileForWeakScope(@NotNull VirtualFile file) {
file.putUserData(USE_WEAK_FILE_SCOPE, Boolean.TRUE);
}
private static class EmptyScope extends GlobalSearchScope {
@Override
public boolean contains(@NotNull VirtualFile file) {

View File

@@ -6,7 +6,6 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@@ -32,15 +31,4 @@ public abstract class ResolveScopeManager {
}
return getInstance(element.getProject()).getResolveScope(element);
}
/**
* Marks a specified file to use a weak file scope. This is useful for modifying
* the scoping mechanism of a file to ensure it is treated under weaker constraints
* than the default resolve scope. It can be used to improve memory consumption.
*
* @param file the virtual file to be marked for weak scope; must not be null
*/
@ApiStatus.Experimental
@ApiStatus.Internal
public void markFileForWeakScope(@NotNull VirtualFile file){}
}