diff --git a/python/python-external-index/src/com/intellij/python/externalIndex/PyExternalFilesIndexService.kt b/python/python-external-index/src/com/intellij/python/externalIndex/PyExternalFilesIndexService.kt index e0bb16f25bec..c1ec34bbaf16 100644 --- a/python/python-external-index/src/com/intellij/python/externalIndex/PyExternalFilesIndexService.kt +++ b/python/python-external-index/src/com/intellij/python/externalIndex/PyExternalFilesIndexService.kt @@ -101,6 +101,13 @@ class PyExternalFilesIndexService(private val project: Project, private val coro } } + fun findSdkForExternallyIndexedFile(file: VirtualFile): Sdk? { + if (!isFileAddedToNonProjectIndex(file)) { + return null + } + return ProjectRootManager.getInstance(project).getProjectSdk() + } + fun isFileAddedToNonProjectIndex(file: VirtualFile): Boolean { val virtualFileManager = project.workspaceModel.getVirtualFileUrlManager() val storage = project.workspaceModel.currentSnapshot diff --git a/python/src/com/jetbrains/python/inspections/quickfix/InstallAllPackagesQuickFix.kt b/python/src/com/jetbrains/python/inspections/quickfix/InstallAllPackagesQuickFix.kt index a82d8b6bd1fd..30a0c5da5f3a 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/InstallAllPackagesQuickFix.kt +++ b/python/src/com/jetbrains/python/inspections/quickfix/InstallAllPackagesQuickFix.kt @@ -4,7 +4,9 @@ package com.jetbrains.python.inspections.quickfix import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo import com.intellij.codeInspection.LocalQuickFix import com.intellij.codeInspection.ProblemDescriptor +import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import com.intellij.python.externalIndex.PyExternalFilesIndexService import com.jetbrains.python.PyBundle import com.jetbrains.python.PyPsiPackageUtil.moduleToPackageName import com.jetbrains.python.packaging.management.ui.PythonPackageManagerUI @@ -16,7 +18,9 @@ class InstallAllPackagesQuickFix(private val packageNames: List) : Local override fun applyFix(project: Project, descriptor: ProblemDescriptor) { val element = descriptor.psiElement ?: return - val sdk = PythonSdkUtil.findPythonSdk(element) ?: return + val sdk = PythonSdkUtil.findPythonSdk(element) + ?: project.service().findSdkForExternallyIndexedFile(descriptor.psiElement.containingFile.virtualFile) + ?: return val normalizedPackageNames = packageNames.map { moduleToPackageName(it) } diff --git a/python/src/com/jetbrains/python/inspections/quickfix/InstallPackageQuickFix.kt b/python/src/com/jetbrains/python/inspections/quickfix/InstallPackageQuickFix.kt index cdff82fd1f7d..264babdb545c 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/InstallPackageQuickFix.kt +++ b/python/src/com/jetbrains/python/inspections/quickfix/InstallPackageQuickFix.kt @@ -5,7 +5,9 @@ import com.intellij.codeInsight.intention.HighPriorityAction import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo import com.intellij.codeInspection.LocalQuickFix import com.intellij.codeInspection.ProblemDescriptor +import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import com.intellij.python.externalIndex.PyExternalFilesIndexService import com.jetbrains.python.PyBundle import com.jetbrains.python.packaging.management.ui.PythonPackageManagerUI import com.jetbrains.python.packaging.utils.PyPackageCoroutine @@ -18,7 +20,9 @@ internal open class InstallPackageQuickFix(open val packageName: String) : Local override fun getFamilyName(): @Nls String = PyBundle.message("python.unresolved.reference.inspection.install.package", packageName) override fun applyFix(project: Project, descriptor: ProblemDescriptor) { - val sdk = PythonSdkUtil.findPythonSdk(descriptor.psiElement) ?: return + val sdk = PythonSdkUtil.findPythonSdk(descriptor.psiElement) + ?: project.service().findSdkForExternallyIndexedFile(descriptor.psiElement.containingFile.virtualFile) + ?: return PyPackageCoroutine.launch(project) { PythonPackageManagerUI.forSdk(project, sdk).installWithConfirmation(listOf(packageName)) ?: return@launch onSuccess(descriptor) diff --git a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.kt b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.kt index 7df63434b956..ca477edfde35 100644 --- a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.kt +++ b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.kt @@ -10,6 +10,7 @@ import com.intellij.codeInspection.ProblemsHolder import com.intellij.codeInspection.options.OptPane import com.intellij.ide.projectView.actions.MarkRootsManager import com.intellij.lang.injection.InjectedLanguageManager +import com.intellij.openapi.components.service import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project @@ -26,6 +27,7 @@ import com.intellij.psi.search.FilenameIndex import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.QualifiedName +import com.intellij.python.externalIndex.PyExternalFilesIndexService import com.intellij.python.pyproject.model.api.isPyProjectTomlBased import com.intellij.util.containers.ContainerUtil import com.jetbrains.python.PyNames @@ -105,7 +107,7 @@ class PyUnresolvedReferencesInspection : PyUnresolvedReferencesInspectionBase() // Don't suggest installing "name" for `import pkg.name` or `from pkg.name import foo`. if (node !is PyReferenceExpression || node.isQualified) { return emptyList() - } + } val qname = QualifiedName.fromDottedString(refName) val components = qname.components @@ -114,14 +116,16 @@ class PyUnresolvedReferencesInspection : PyUnresolvedReferencesInspectionBase() } val packageName = PyPsiPackageUtil.moduleToPackageName(components[0]) + val project = node.project val module = ModuleUtilCore.findModuleForPsiElement(node) val sdk = PythonSdkUtil.findPythonSdk(module) - if (module == null || sdk == null || !PyPackageUtil.packageManagementEnabled(sdk, false, true)) { + ?: project.service().findSdkForExternallyIndexedFile(node.containingFile.virtualFile) + if (sdk == null || !PyPackageUtil.packageManagementEnabled(sdk, false, true)) { return emptyList() } - val packageManager = PythonPackageManager.forSdk(module.project, sdk) + val packageManager = PythonPackageManager.forSdk(project, sdk) val shouldBeSuggest = !sdk.isReadOnly && packageManager.isNotInstalledAndCanBeInstalled(packageName) if (!shouldBeSuggest)