PY-86864 Replace PyInterpreterInspection with EditorNotificationProvider

Replace the LocalInspectionTool-based "no interpreter" warning with an
EditorNotificationProvider banner. This extends coverage to pyproject.toml
and README.md files (in addition to .py files) and simplifies the fix
architecture.

Key changes:
- Delete PyInterpreterInspection, replace with PyInterpreterNotificationProvider
- Add PyInterpreterNotificationFileOpenedListener for split-editor timing
- Replace LocalQuickFix with a simpler InterpreterFix interface (no ProblemDescriptor)
- Simplify PyAsyncFileInspectionRunner: use refreshAfterWrite for flicker-free
  cache refresh, use EditorNotifications instead of DaemonCodeAnalyzer
- Remove PyInterpreterInspectionSuppressor (no longer needed without inspection)
- Add isPythonModule check for the module
- Move bundle keys from PyPsiBundle to PyBundle with python.sdk.* prefix
- Extract CONFIGURABLE_ID constant in PyActiveSdkModuleConfigurable

IJ-MR-192977

(cherry picked from commit 6b3584d6c6beac53f4b8f0abb9a34e698b4ad03f)

GitOrigin-RevId: 1df48bbfbade2f7f31ffae7b02a0cab2f1f68389
This commit is contained in:
Vitaly Legchilkin
2026-02-24 08:23:28 +00:00
committed by intellij-monorepo-bot
parent cb03d603c8
commit 20b5c8c972
25 changed files with 506 additions and 533 deletions
@@ -119,6 +119,8 @@
topic="com.jetbrains.python.packaging.common.PythonPackageManagementListener"/>
<listener class="com.jetbrains.python.statistics.PyPackageDaemonListener"
topic="com.intellij.codeInsight.daemon.DaemonCodeAnalyzer$DaemonListener"/>
<listener class="com.jetbrains.python.inspections.interpreter.PyInterpreterNotificationFileOpenedListener"
topic="com.intellij.openapi.fileEditor.FileEditorManagerListener"/>
</projectListeners>
<extensions defaultExtensionNs="com.intellij">
@@ -273,9 +275,7 @@
<localInspection language="Python" shortName="PyPep8Inspection" suppressId="PyPep8" bundle="messages.PyPsiBundle"
key="INSP.pep8.coding.style.violation" groupKey="INSP.GROUP.python" enabledByDefault="true" level="INFORMATION"
implementationClass="com.jetbrains.python.inspections.PyPep8Inspection" unfair="true"/>
<localInspection language="Python" shortName="PyInterpreterInspection" suppressId="PyInterpreter" bundle="messages.PyPsiBundle"
key="INSP.NAME.invalid.interpreter" groupKey="INSP.GROUP.python" enabledByDefault="true" level="WARNING"
implementationClass="com.jetbrains.python.inspections.interpreter.PyInterpreterInspection"/>
<editorNotificationProvider implementation="com.jetbrains.python.inspections.interpreter.PyInterpreterNotificationProvider"/>
<localInspection language="Python" shortName="PyStubPackagesCompatibilityInspection" suppressId="PyStubPackagesCompatibility"
bundle="messages.PyPsiBundle" key="INSP.stub.packages.compatibility" groupKey="INSP.GROUP.python"
enabledByDefault="true" level="WARNING"
@@ -961,7 +961,6 @@
<systemPythonProvider implementation="com.jetbrains.python.sdk.uv.UvSystemPythonProvider"/>
<inspectionExtension implementation="com.jetbrains.python.sdk.configuration.suppressors.PyInterpreterInspectionSuppressor"/>
<inspectionExtension implementation="com.jetbrains.python.inspections.PyUnresolvedReferenceDefaultInspectionExtension" order="last"/>
<runConfigurationEditorExtension implementation="com.jetbrains.python.run.PyRunConfigurationTargetOptions"/>
@@ -348,6 +348,14 @@ remote.debug.suspend.on.connect=Suspend after connect
python.debug.remote.name=PyRemoteDebug
filetype.python.debug.remote.description=Remote debug
python.sdk.no.interpreter.configured.for.module=No Python interpreter configured for {0}
python.sdk.configure.python.interpreter=Configure Python interpreter
python.sdk.checking.existing.environments=Checking existing environments
python.sdk.interpreter.settings=Interpreter settings
python.sdk.pipenv.associated.with.another.project=Pipenv interpreter is associated with another project: ''{0}''
python.sdk.pipenv.associated.with.another.module=Pipenv interpreter is associated with another module: ''{0}''
python.sdk.pipenv.not.associated.with.any.project=Pipenv interpreter is not associated with any project
python.sdk.pipenv.not.associated.with.any.module=Pipenv interpreter is not associated with any module
python.sdk.validating.environment=Validating environment
python.sdk.getting.remote.interpreter.version=Getting Remote Interpreter Version
python.sdk.cannot.evaluate.sdk.version.error.message=Cannot evaluate interpreter version
@@ -363,38 +371,18 @@ python.sdk.downloading.package.progress.title=Downloading package from {0}
python.sdk.select.conda.path.title=Select Path to Conda Executable
python.sdk.conda.no.env.selected.error=No Conda environment selected
python.sdk.conda.no.base.env.error=No base Conda environment available
python.sdk.conda.problem.running=Problem running conda
python.sdk.conda.problem.env.empty.invalid=Environment name is empty or invalid
python.sdk.conda.problem.env.name.used=This name is used already. Please, choose another one.
python.sdk.conda.getting.list.envs=Getting list of conda envs
python.sdk.conda.no.exec=Conda executable is not found
python.sdk.conda.cant.create.title=Conda can't create new environment
python.sdk.conda.cant.create.body=The error is: ''{0}''
python.sdk.conda.env=Environment
python.sdk.conda.path=Conda executable:
python.sdk.select.location.for.conda.title=Select Location for Conda Environment
python.sdk.environment.yml.chooser=Choose environment.yml
python.sdk.environment.yml.label=environment.yml
python.sdk.creating.conda.environment.sentence=Creating conda environment
python.sdk.creating.conda.environment.title=Creating Conda Environment
python.sdk.add.python.interpreter.title=Add Python Interpreter
python.sdk.python.interpreter.title.0=Python Interpreter: {0}
python.sdk.new.environment.kind=New {0} environment
python.sdk.next=Next
python.sdk.previous=Previous
python.sdk.finish=Finish
python.sdk.setting.up.pipenv.sentence=Setting up pipenv environment
python.sdk.using.pipenv.sentence=Using pipenv environment
python.sdk.setting.up.pipenv.title=Setting up Pipenv Environment
python.sdk.install.requirements.from.pipenv.lock=Install requirements from Pipfile.lock
python.sdk.pipenv.executable=Pipenv executable:
python.sdk.pipenv.select.executable.title=Select Path to Pipenv Executable
python.sdk.pipenv.associated.project=Associated project:
python.sdk.pipenv.associated.module=Associated module:
python.sdk.pipenv.execution.exception.no.project.message=Cannot find the project associated with this Pipenv environment
python.sdk.pipenv.execution.exception.no.pipenv.message=Cannot find Pipenv
python.sdk.pipenv.execution.exception.error.running.pipenv.message=Error Running Pipenv
python.sdk.pipenv.quickfix.fix.pipenv.name=Fix Pipenv interpreter
python.sdk.pipenv.quickfix.use.pipenv.name=Use Pipenv interpreter
python.sdk.pipenv.pip.file.lock.not.found=Pipfile.lock is not found
python.sdk.pipenv.pip.file.lock.out.of.date=Pipfile.lock is out of date
@@ -408,20 +396,13 @@ python.sdk.new.error.no.absolute=Path must be absolute
python.sdk.executable.is.not.detected=Executable is not detected
# Poetry package manager and SDK
python.sdk.dialog.message.creating.virtual.environments.based.on.poetry.environments.not.supported=Creating virtual environments based on Poetry environments is not supported
python.sdk.dialog.title.setting.up.poetry.environment=Setting up poetry environment
python.sdk.inspection.message.poetry.interpreter.associated.with.another.project=Poetry interpreter is associated with another {0}: {1}
python.sdk.inspection.message.poetry.interpreter.not.associated.with.any.project=Poetry interpreter is not associated with any {0}
python.sdk.inspection.message.version.outdated.latest=''{0}'' version {1} is outdated (latest: {2})
python.sdk.poetry.associated.module=Associated module:
python.sdk.poetry.associated.project=Associated project:
python.sdk.poetry.dialog.add.new.environment.in.project.checkbox=Create an in-project environment
python.sdk.poetry.executable=Poetry executable:
python.sdk.poetry.execution.exception.no.poetry.message=Cannot find Poetry
python.sdk.poetry.install.packages.from.toml.checkbox.text=Install packages from pyproject.toml
python.sdk.poetry.pip.file.watcher=pyproject.toml Watcher
python.sdk.poetry.quickfix.use.pipenv.name=Use Poetry interpreter
python.sdk.poetry.select.executable.title=Select Path to Poetry Executable
python.sdk.progress.setting.up.environment=Setting up Environment
python.sdk.poetry.supports.installing.only.packages.from.repositories=Poetry supports installing only packages from repositories
python.sdk.provided.path.is.invalid=The provided path is invalid: {0}
@@ -434,13 +415,11 @@ python.sdk.uv.executable.not.found=uv executable is not found
python.sdk.uv.executable=uv executable:
python.sdk.uv.failed.to.initialize.uv.environment=Failed to initialize uv environment
python.sdk.uv.failed.to.detect.uv.python.directory=Failed to detect uv Python directory
python.sdk.uv.working.dir.is.not.specified=working dir is not specified for uv environment setup
python.sdk.uv.default.version=Default
python.sdk.local=Local
python.sdk.creating.python.module.structure=Creating Python Module Structure
python.sdk.creating.python.sdk=Creating Python SDK
python.sdk.pipenv.has.been.selected=Pipenv interpreter has been already added, select ''{0}'' in your interpreters list
python.sdk.there.is.no.interpreter=No interpreter
python.sdk.no.interpreter.selected=No interpreter selected
python.sdk.no.interpreter.configured.warning=No Python interpreter configured for the project
@@ -460,10 +439,6 @@ python.sdk.non.zero.exit.code=Python interpreter process exited with a non-zero
python.sdk.executable.not.found.header=Python executable is not found. Choose one of the following options:
python.sdk.executable.not.found.option.specify.path=Click {0} to specify a path to {1} in your file system
python.sdk.executable.not.found.option.download.and.install=Click {0} to download and install Python from python.org ({1})
python.sdk.executable.not.found.option.install.with.cldt=Click {0} to install Python with the Command-Line Developer Tools: {1}
python.sdk.executable.not.found.option.install.or.brew=Install Python manually from python.org or via Homebrew
python.sdk.admin.permissions.needed.consider.creating.venv=<html><strong>Note:</strong> You'll need admin permissions to install packages for this interpreter. Consider creating a per-project virtual environment instead.</html>
python.sdk.admin.permissions.needed.consider.creating.venv.content=<strong>Note:</strong> You'll need admin permissions to install packages for this interpreter. Consider creating a per-project virtual environment instead.
python.sdk.invalid.python.sdk=Invalid Python SDK
python.sdk.cannot.setup.sdk=Cannot set up a python SDK \nat {0}.\nThe SDK seems invalid.
@@ -1801,7 +1776,7 @@ sdk.use.existing.venv=Use existing virtual environment {0}
sdk.create.venv.suggestion.no.arg=Create a virtual environment
sdk.cannot.find.venv.for.module=Can't find venv for the module
sdk.set.up.uv.environment=Set up a uv {0} environment
sdk.set.up.uv.environment=Set up uv environment
sdk.cannot.find.uv.executable=Cannot find uv executable
sdk.cannot.find.python=No Pythons were found on the system