diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java index 8e9f9607a267..4bf4ba1d3e16 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java @@ -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 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) { diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyTypingAliasStubType.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyTypingAliasStubType.java index 9f81fba39288..6ef4486ab011 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyTypingAliasStubType.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/stubs/PyTypingAliasStubType.java @@ -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); + }); } }