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) }
}
}