diff --git a/python/pluginResources/messages/PyBundle.properties b/python/pluginResources/messages/PyBundle.properties index d258187c45bf..1d8991dc0a3f 100644 --- a/python/pluginResources/messages/PyBundle.properties +++ b/python/pluginResources/messages/PyBundle.properties @@ -229,6 +229,16 @@ settings.python.group.description=Configure key Python development s settings.python.tools.group.title=Tools settings.python.tools.group.description=Configure external Python tool settings. +# Type Engine Settings +configurable.PyTypeEngineConfigurable.display.name=Type Engine +configurable.PyTypeEngineConfigurable.engine.label=Type engine: +configurable.PyTypeEngineConfigurable.project.default=Project default +configurable.PyTypeEngineConfigurable.project.default.description=Use the project-level type engine setting for this module. +configurable.PyTypeEngineConfigurable.pycharm.description=A smart IDE type engine optimized for real world Python, including Django templates, SqlAlchemy models, and more. +configurable.PyTypeEngineConfigurable.pyrefly.description=Currently in Beta, Pyrefly provides fast and accurate type checking, with experimental support for Django and Pydantic. +configurable.PyTypeEngineConfigurable.ty.description=Currently in Beta, ty provides fast and accurate type checking designed to work well with untyped code. Supports advanced type analysis features. +configurable.PyTypeEngineConfigurable.open.settings=Type Engine Settings\u2026 + runcfg.autodetect.display_name=Autodetect runcfg.autodetect.parameters.group.name=Python test diff --git a/python/python-psi-api/resources/intellij.python.psi.xml b/python/python-psi-api/resources/intellij.python.psi.xml index 1f563b87e08e..af3a4bfb3161 100644 --- a/python/python-psi-api/resources/intellij.python.psi.xml +++ b/python/python-psi-api/resources/intellij.python.psi.xml @@ -42,7 +42,7 @@ interface="com.jetbrains.python.documentation.PythonDocumentationQuickInfoProvider" dynamic="true"/> diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.kt b/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.kt index a4c9b1a96212..72187f072ab0 100644 --- a/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.kt +++ b/python/python-psi-api/src/com/jetbrains/python/psi/types/TypeEvalContext.kt @@ -24,8 +24,8 @@ import com.jetbrains.python.psi.PyInstantTypeProvider import com.jetbrains.python.psi.PyTypedElement import com.jetbrains.python.psi.resolve.PyResolveContext import com.jetbrains.python.psi.resolve.RatedResolveResult -import com.jetbrains.python.psi.types.external.ExternalPyTypeResolver -import com.jetbrains.python.psi.types.external.ExternalPyTypeResolverProvider.Companion.createTypeResolver +import com.jetbrains.python.psi.types.engine.PyTypeEngine +import com.jetbrains.python.psi.types.engine.PyTypeEngineProvider.Companion.createTypeResolver import com.jetbrains.python.pyi.PyiLanguageDialect import org.jetbrains.annotations.ApiStatus import java.util.concurrent.ConcurrentMap @@ -52,7 +52,7 @@ sealed class TypeEvalContext( private val myProcessingContext = ThreadLocal.withInitial { ProcessingContext() } - private var externalTypeResolver: ExternalPyTypeResolver? = null + private var typeEngine: PyTypeEngine? = null protected val myEvaluated: MutableMap = getConcurrentMapForCaching() protected val myEvaluatedReturn: MutableMap = getConcurrentMapForCaching() protected val contextTypeCache: ConcurrentMap, PyType> = getConcurrentMapForCaching() @@ -63,7 +63,7 @@ sealed class TypeEvalContext( init { if (constraints.myOrigin != null) { - externalTypeResolver = createTypeResolver(constraints.myOrigin.project) + typeEngine = createTypeResolver(constraints.myOrigin.project) } } @@ -196,8 +196,8 @@ sealed class TypeEvalContext( return RecursionManager.doPreventingRecursion(element to this, false) { val type: PyType? - if (externalTypeResolver != null && externalTypeResolver!!.isSupportedForResolve(element)) { - type = Ref.deref(externalTypeResolver!!.resolveType(element, this is LibraryTypeEvalContext)) + if (typeEngine != null && typeEngine!!.isSupportedForResolve(element)) { + type = Ref.deref(typeEngine!!.resolveType(element, this is LibraryTypeEvalContext)) } else { type = element.getType(this, KeyImpl) @@ -244,7 +244,7 @@ sealed class TypeEvalContext( val origin: PsiFile? = constraints.myOrigin val usesExternalTypeProvider: Boolean - get() = externalTypeResolver != null + get() = typeEngine != null @ApiStatus.Internal fun getContextTypeCache(): MutableMap, PyType?> { diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/types/external/ExternalPyTypeResolver.kt b/python/python-psi-api/src/com/jetbrains/python/psi/types/engine/PyTypeEngine.kt similarity index 85% rename from python/python-psi-api/src/com/jetbrains/python/psi/types/external/ExternalPyTypeResolver.kt rename to python/python-psi-api/src/com/jetbrains/python/psi/types/engine/PyTypeEngine.kt index a5996a9f853f..af0b082272c5 100644 --- a/python/python-psi-api/src/com/jetbrains/python/psi/types/external/ExternalPyTypeResolver.kt +++ b/python/python-psi-api/src/com/jetbrains/python/psi/types/engine/PyTypeEngine.kt @@ -1,5 +1,5 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.jetbrains.python.psi.types.external +package com.jetbrains.python.psi.types.engine import com.intellij.openapi.util.Ref import com.jetbrains.python.psi.PyTypedElement @@ -7,7 +7,7 @@ import com.jetbrains.python.psi.types.PyType import org.jetbrains.annotations.ApiStatus @ApiStatus.Internal -interface ExternalPyTypeResolver { +interface PyTypeEngine { fun isSupportedForResolve(pyTypedElement: PyTypedElement): Boolean fun resolveType(pyTypedElement: PyTypedElement, isLibrary: Boolean): Ref? } diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/types/external/ExternalPyTypeResolverProvider.kt b/python/python-psi-api/src/com/jetbrains/python/psi/types/engine/PyTypeEngineProvider.kt similarity index 63% rename from python/python-psi-api/src/com/jetbrains/python/psi/types/external/ExternalPyTypeResolverProvider.kt rename to python/python-psi-api/src/com/jetbrains/python/psi/types/engine/PyTypeEngineProvider.kt index 3d3b01f5d875..e3a176f0996b 100644 --- a/python/python-psi-api/src/com/jetbrains/python/psi/types/external/ExternalPyTypeResolverProvider.kt +++ b/python/python-psi-api/src/com/jetbrains/python/psi/types/engine/PyTypeEngineProvider.kt @@ -1,5 +1,5 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.jetbrains.python.psi.types.external +package com.jetbrains.python.psi.types.engine import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.project.Project @@ -10,16 +10,16 @@ import org.jetbrains.annotations.ApiStatus * Implementations may return `null` if they cannot provide a type for the given element. */ @ApiStatus.Internal -interface ExternalPyTypeResolverProvider { - fun createResolver(project: Project): ExternalPyTypeResolver? = null +interface PyTypeEngineProvider { + fun createResolver(project: Project): PyTypeEngine? = null companion object { - private val EP_NAME: ExtensionPointName = - ExtensionPointName.Companion.create("Pythonid.typeEvalExternalTypeProvider") + private val EP_NAME = + ExtensionPointName.create("Pythonid.typeEvalExternalTypeProvider") @JvmStatic @ApiStatus.Internal - fun createTypeResolver(project: Project): ExternalPyTypeResolver? { + fun createTypeResolver(project: Project): PyTypeEngine? { return EP_NAME.extensionList.firstNotNullOfOrNull { it.createResolver(project) } } }