PY-82905 PyCharm extremely slowing down (almost blocked) with message: 'IDE running on low memory'

GitOrigin-RevId: 5e6e5ba64a12d4c1cc826f0b783877494747433f
This commit is contained in:
Vladimir.Koshelev
2025-07-30 09:21:13 +02:00
committed by intellij-monorepo-bot
parent 742bef79da
commit 4dcf05fc6d
2 changed files with 29 additions and 22 deletions

View File

@@ -7,6 +7,9 @@ import com.intellij.openapi.util.Version;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.*;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.psi.util.QualifiedName;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyStubElementTypes;
@@ -83,8 +86,11 @@ public class PyClassElementType extends PyStubElementType<PyClassStub, PyClass>
if (classStub == null) {
return List.of(pyClass.getSuperClassExpressions());
}
return ContainerUtil.mapNotNull(classStub.getSuperClassesText(),
x -> PyUtil.createExpressionFromFragment(x, pyClass.getContainingFile()));
return CachedValuesManager.getCachedValue(pyClass, () -> CachedValueProvider.Result.create(
(ContainerUtil.mapNotNull(classStub.getSuperClassesText(),
x -> PyUtil.createExpressionFromFragment(x, pyClass.getContainingFile()))),
PsiModificationTracker.MODIFICATION_COUNT)
);
}
private static @Nullable QualifiedName resolveOriginalSuperClassQName(@NotNull PyExpression superClassExpression) {

View File

@@ -20,8 +20,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.StubInputStream;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.intellij.psi.util.*;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.PyTokenTypes;
@@ -199,25 +198,27 @@ public final class PyTypingAliasStubType extends CustomTargetExpressionStubType<
* @see PyTypingAliasStub
*/
public static @Nullable PyExpression getAssignedValueStubLike(@NotNull PyTargetExpression target) {
final PyTargetExpressionStub stub = target.getStub();
PyExpression result = null;
if (stub != null) {
final PyTypingAliasStub aliasStub = stub.getCustomStub(PyTypingAliasStub.class);
String aliasText = null;
if (aliasStub != null) {
aliasText = aliasStub.getText();
return CachedValuesManager.getCachedValue(target, () -> {
final PyTargetExpressionStub stub = target.getStub();
PyExpression result = null;
if (stub != null) {
final PyTypingAliasStub aliasStub = stub.getCustomStub(PyTypingAliasStub.class);
String aliasText = null;
if (aliasStub != null) {
aliasText = aliasStub.getText();
}
else if (stub.getInitializerType() == InitializerType.ReferenceExpression) {
aliasText = Objects.toString(stub.getInitializer(), null);
}
if (aliasText != null) {
result = PyUtil.createExpressionFromFragment(aliasText, target.getContainingFile());
}
}
else if (stub.getInitializerType() == InitializerType.ReferenceExpression) {
aliasText = Objects.toString(stub.getInitializer(), null);
else {
// Use PSI to get the assigned value but only if the same expression would be saved in stubs
result = getAssignedValueIfTypeAliasLike(target, false);
}
if (aliasText != null) {
result = PyUtil.createExpressionFromFragment(aliasText, target.getContainingFile());
}
}
else {
// Use PSI to get the assigned value but only if the same expression would be saved in stubs
result = getAssignedValueIfTypeAliasLike(target, false);
}
return result;
return CachedValueProvider.Result.create(result, PsiModificationTracker.MODIFICATION_COUNT);
});
}
}