diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.java b/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.java index 08346aa8633a..c26ce825004c 100644 --- a/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.java +++ b/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.java @@ -297,6 +297,10 @@ public sealed class TypeEvalContext { return Registry.is("python.use.separated.libraries.type.cache") && isLibraryElement(element); } + private static boolean isExternalTypeProviderApplicable(PyTypedElement element) { + return element instanceof PyInstantTypeProvider; + } + public @Nullable PyType getType(final @NotNull PyTypedElement element) { if (canDelegateToLibraryContext(element)) { var context = getLibraryContext(element.getProject()); @@ -311,24 +315,26 @@ public sealed class TypeEvalContext { Pair.create(element, this), false, () -> { - var externalTypeProvider = - ContainerUtil.find(TypeEvalExternalTypeProvider.EP_NAME.getExtensionList(), TypeEvalExternalTypeProvider::isAvailable); - if (!isInsideExternalTypeProviderCall && externalTypeProvider != null) { - try { - isInsideExternalTypeProviderCall = true; - var provided = externalTypeProvider.provideType(element, this); - isInsideExternalTypeProviderCall = false; - if (provided != null) { - var type = provided.get(); - myExternalEvaluated.put(element, type == null ? PyNullType.INSTANCE : type); - return type; + if (!isExternalTypeProviderApplicable(element) && !isInsideExternalTypeProviderCall) { + var externalTypeProvider = + ContainerUtil.find(TypeEvalExternalTypeProvider.EP_NAME.getExtensionList(), TypeEvalExternalTypeProvider::isAvailable); + if (externalTypeProvider != null) { + try { + isInsideExternalTypeProviderCall = true; + var provided = externalTypeProvider.provideType(element, this); + isInsideExternalTypeProviderCall = false; + if (provided != null) { + var type = provided.get(); + myExternalEvaluated.put(element, type == null ? PyNullType.INSTANCE : type); + return type; + } + } + catch (ProcessCanceledException e) { + throw e; + } + catch (Exception e) { + logger.warn("Exception during external type provider " + externalTypeProvider.getClass().getName(), e); } - } - catch (ProcessCanceledException e) { - throw e; - } - catch (Exception e) { - logger.warn("Exception during external type provider " + externalTypeProvider.getClass().getName(), e); } } diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalExternalTypeProvider.kt b/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalExternalTypeProvider.kt index 45d278172c98..eaec9ddeffb1 100644 --- a/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalExternalTypeProvider.kt +++ b/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalExternalTypeProvider.kt @@ -4,11 +4,13 @@ package com.jetbrains.python.psi.types import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.util.Ref import com.jetbrains.python.psi.PyTypedElement +import org.jetbrains.annotations.ApiStatus /** * An external type provider invoked by [TypeEvalContext] to obtain a type from a separate engine. * Implementations may return `null` if they cannot provide a type for the given element. */ +@ApiStatus.Internal interface TypeEvalExternalTypeProvider { fun isAvailable(): Boolean