diff --git a/python/BUILD.bazel b/python/BUILD.bazel index b15963481795..5f3e272a9508 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -353,6 +353,7 @@ jvm_library( "//python/impl.helperLocator:community-helpersLocator", "//python/python-exec-service/execService.python", "//python/interpreters", + "//python/python-sdk-configurator/common", ], exports = [ "//python/openapi:community", diff --git a/python/ide/impl/BUILD.bazel b/python/ide/impl/BUILD.bazel index 105cd7649ca5..6b00abf65a99 100644 --- a/python/ide/impl/BUILD.bazel +++ b/python/ide/impl/BUILD.bazel @@ -66,6 +66,7 @@ jvm_library( "//python/common", "//platform/non-modal-welcome-screen/backend", "//python/python-exec-service:community-execService", + "//python/python-sdk-configurator/common", ], runtime_deps = ["//python/python-features-trainer:featuresTrainer"], plugins = ["@lib//:compose-plugin"] @@ -138,6 +139,7 @@ jvm_library( "//platform/non-modal-welcome-screen/backend", "//python/python-exec-service:community-execService", "//python/python-exec-service:community-execService_test_lib", + "//python/python-sdk-configurator/common", ], plugins = ["@lib//:compose-plugin"] ) diff --git a/python/ide/impl/intellij.pycharm.community.ide.impl.iml b/python/ide/impl/intellij.pycharm.community.ide.impl.iml index 4c5c5437c6de..837517cc5cbe 100644 --- a/python/ide/impl/intellij.pycharm.community.ide.impl.iml +++ b/python/ide/impl/intellij.pycharm.community.ide.impl.iml @@ -80,5 +80,6 @@ + \ No newline at end of file diff --git a/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml b/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml index f0e91f74db20..1fbe8ceb3584 100644 --- a/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml +++ b/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml @@ -6,6 +6,7 @@ + diff --git a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PythonSdkConfigurator.kt b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PythonSdkConfigurator.kt index f2be98d0adc3..08d669694281 100644 --- a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PythonSdkConfigurator.kt +++ b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PythonSdkConfigurator.kt @@ -6,6 +6,7 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.EDT import com.intellij.openapi.diagnostic.debug import com.intellij.openapi.diagnostic.thisLogger +import com.intellij.openapi.extensions.ExtensionNotApplicableException import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager @@ -25,6 +26,7 @@ import com.intellij.platform.ide.progress.withBackgroundProgress import com.intellij.platform.util.progress.reportRawProgress import com.intellij.python.community.services.systemPython.SystemPython import com.intellij.python.community.services.systemPython.SystemPythonService +import com.intellij.python.sdkConfigurator.common.enableSDKAutoConfigurator import com.jetbrains.python.PyBundle import com.jetbrains.python.packaging.utils.PyPackageCoroutine import com.jetbrains.python.sdk.* @@ -41,6 +43,13 @@ import java.nio.file.Path class PythonSdkConfigurator : DirectoryProjectConfigurator { + init { + // new SDK configurator obsoletes this engine + if (enableSDKAutoConfigurator) { + throw ExtensionNotApplicableException.create() + } + } + override fun configureProject(project: Project, baseDir: VirtualFile, moduleRef: Ref, isProjectCreatedWithWizard: Boolean) { val sdk = project.pythonSdk thisLogger().debug { "Input: $sdk, $isProjectCreatedWithWizard" } diff --git a/python/intellij.python.community.impl.iml b/python/intellij.python.community.impl.iml index 071cb2331eed..9bb19f0892d3 100644 --- a/python/intellij.python.community.impl.iml +++ b/python/intellij.python.community.impl.iml @@ -188,5 +188,6 @@ + \ No newline at end of file diff --git a/python/pluginResources/intellij.python.community.impl.xml b/python/pluginResources/intellij.python.community.impl.xml index 1736e0f11e64..960d33d9813f 100644 --- a/python/pluginResources/intellij.python.community.impl.xml +++ b/python/pluginResources/intellij.python.community.impl.xml @@ -19,6 +19,7 @@ + messages.PyBundle diff --git a/python/python-sdk-configurator/backend/resources/intellij.python.sdkConfigurator.backend.xml b/python/python-sdk-configurator/backend/resources/intellij.python.sdkConfigurator.backend.xml index b125e66ec1bf..09ccc3c3b20d 100644 --- a/python/python-sdk-configurator/backend/resources/intellij.python.sdkConfigurator.backend.xml +++ b/python/python-sdk-configurator/backend/resources/intellij.python.sdkConfigurator.backend.xml @@ -7,6 +7,7 @@ + messages.PySdkConfiguratorBundle @@ -14,4 +15,12 @@ + + + + + + + diff --git a/python/python-sdk-configurator/backend/resources/messages/PySdkConfiguratorBundle.properties b/python/python-sdk-configurator/backend/resources/messages/PySdkConfiguratorBundle.properties index 4b2cf6c5780a..e3fa557727f6 100644 --- a/python/python-sdk-configurator/backend/resources/messages/PySdkConfiguratorBundle.properties +++ b/python/python-sdk-configurator/backend/resources/messages/PySdkConfiguratorBundle.properties @@ -1 +1,3 @@ -intellij.python.sdk.configuring.module=Configuring SDK for module {0} \ No newline at end of file +intellij.python.sdk.configuring.module=Configuring SDK for module {0} +action.ConfigureSDKAction.text=Configure SDK Automatically +action.ConfigureSDKAction.description=Configure SDK for all modules in project \ No newline at end of file diff --git a/python/python-sdk-configurator/backend/src/impl/backendLib.kt b/python/python-sdk-configurator/backend/src/impl/backendLib.kt index eef6e5752f36..96e31cec296f 100644 --- a/python/python-sdk-configurator/backend/src/impl/backendLib.kt +++ b/python/python-sdk-configurator/backend/src/impl/backendLib.kt @@ -1,5 +1,8 @@ package com.intellij.python.sdkConfigurator.backend.impl +import com.intellij.openapi.components.Service +import com.intellij.openapi.components.Service.Level +import com.intellij.openapi.components.service import com.intellij.openapi.diagnostic.fileLogger import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project @@ -7,16 +10,38 @@ import com.intellij.openapi.project.modules import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.platform.ide.progress.withBackgroundProgress +import com.intellij.platform.rpc.topics.sendToClient import com.intellij.python.pyproject.model.api.SuggestedSdk import com.intellij.python.pyproject.model.api.suggestSdk -import com.intellij.python.sdkConfigurator.common.ModuleName +import com.intellij.python.sdkConfigurator.common.impl.ModuleName +import com.intellij.python.sdkConfigurator.common.impl.ModulesDTO +import com.intellij.python.sdkConfigurator.common.impl.SHOW_SDK_CONFIG_UI_TOPIC import com.jetbrains.python.Result import com.jetbrains.python.sdk.configuration.PyProjectSdkConfigurationExtension import com.jetbrains.python.sdk.getOrCreateAdditionalData import com.jetbrains.python.sdk.setAssociationToPath +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext +private val askUserMutex = Mutex() + +// TODO: DOC +internal fun configureSdkAskingUser(project: Project) { + project.service().scope.launch(Dispatchers.Default) { + askUserMutex.withLock { + val moduleToSuggestedSdk = getModulesWithoutSDK(project) + if (moduleToSuggestedSdk.modules.isNotEmpty()) { + // No need to send empty list + SHOW_SDK_CONFIG_UI_TOPIC.sendToClient(project, moduleToSuggestedSdk) + } + } + } +} + /** * Configures SDK for modules without SDK in automatic manner trying to fix as many modules as possible. * Errors are logged. @@ -85,6 +110,15 @@ internal suspend fun configureSdkAutomatically(project: Project, modulesOnly: Se } } +private suspend fun getModulesWithoutSDK(project: Project): ModulesDTO = + ModulesDTO(project.modules.filter { ModuleRootManager.getInstance(it).sdk == null }.associate { module -> + val parent = when (val r = module.suggestSdk()) { + null, is SuggestedSdk.PyProjectIndependent -> null + is SuggestedSdk.SameAs -> r.parentModule + } + Pair(module.name, parent?.name) + }) + private suspend fun configureSdkForModule(module: Module, configurators: List, checkForIntention: Boolean): Boolean { for (extension in configurators) { if (checkForIntention && extension.getIntention(module) == null) { @@ -107,4 +141,8 @@ private suspend fun configureSdkForModule(module: Module, configurators: List().scope.launch(Dispatchers.Default) { - mutex.withLock { - // TODO: Extract to lib - val moduleToSuggestedSdk = project.modules.filter { ModuleRootManager.getInstance(it).sdk == null }.associate { module -> - val parent = when (val r = module.suggestSdk()) { - null, is SuggestedSdk.PyProjectIndependent -> null - is SuggestedSdk.SameAs -> r.parentModule - } - Pair(module.name, parent?.name) - } - if (moduleToSuggestedSdk.isNotEmpty()) { - SHOW_SDK_CONFIG_UI_TOPIC.sendToClient(project, ModulesDTO(moduleToSuggestedSdk)) - } - } + init { + if (!enableSDKAutoConfigurator) { + throw ExtensionNotApplicableException.create() } } + + override fun modelRebuilt(project: Project) { + configureSdkAskingUser(project) + } } -@Service(Level.PROJECT) -private class MyService(val scope: CoroutineScope) diff --git a/python/python-sdk-configurator/backend/src/impl/rpcBridge/ApiProvider.kt b/python/python-sdk-configurator/backend/src/impl/rpcBridge/ApiProvider.kt index e82dfd2c996e..3535dc6f6c8d 100644 --- a/python/python-sdk-configurator/backend/src/impl/rpcBridge/ApiProvider.kt +++ b/python/python-sdk-configurator/backend/src/impl/rpcBridge/ApiProvider.kt @@ -1,13 +1,13 @@ package com.intellij.python.sdkConfigurator.backend.impl.rpcBridge import com.intellij.platform.rpc.backend.RemoteApiProvider -import com.intellij.python.sdkConfigurator.common.SdkConfiguratorApi +import com.intellij.python.sdkConfigurator.common.impl.SdkConfiguratorBackEndApi import fleet.rpc.remoteApiDescriptor internal class ApiProvider : RemoteApiProvider { override fun RemoteApiProvider.Sink.remoteApis() { - remoteApi(remoteApiDescriptor()) { + remoteApi(remoteApiDescriptor()) { SdkConfiguratorApiImpl } } diff --git a/python/python-sdk-configurator/backend/src/impl/rpcBridge/BackendTopicListener.kt b/python/python-sdk-configurator/backend/src/impl/rpcBridge/BackendTopicListener.kt new file mode 100644 index 000000000000..ed9bb9e76efd --- /dev/null +++ b/python/python-sdk-configurator/backend/src/impl/rpcBridge/BackendTopicListener.kt @@ -0,0 +1,15 @@ +package com.intellij.python.sdkConfigurator.backend.impl.rpcBridge + +import com.intellij.openapi.project.Project +import com.intellij.platform.rpc.topics.ProjectRemoteTopic +import com.intellij.platform.rpc.topics.ProjectRemoteTopicListener +import com.intellij.python.sdkConfigurator.backend.impl.configureSdkAskingUser +import com.intellij.python.sdkConfigurator.common.impl.DETECT_SDK_FOR_MODULES + +internal class BackendTopicListener : ProjectRemoteTopicListener { + override val topic: ProjectRemoteTopic = DETECT_SDK_FOR_MODULES + + override fun handleEvent(project: Project, event: Unit) { + configureSdkAskingUser(project) + } +} diff --git a/python/python-sdk-configurator/backend/src/impl/rpcBridge/SdkConfiguratorApiImpl.kt b/python/python-sdk-configurator/backend/src/impl/rpcBridge/SdkConfiguratorApiImpl.kt index 1ff7ac639238..66dada0bf9c4 100644 --- a/python/python-sdk-configurator/backend/src/impl/rpcBridge/SdkConfiguratorApiImpl.kt +++ b/python/python-sdk-configurator/backend/src/impl/rpcBridge/SdkConfiguratorApiImpl.kt @@ -3,10 +3,10 @@ package com.intellij.python.sdkConfigurator.backend.impl.rpcBridge import com.intellij.platform.project.ProjectId import com.intellij.platform.project.findProject import com.intellij.python.sdkConfigurator.backend.impl.configureSdkAutomatically -import com.intellij.python.sdkConfigurator.common.ModuleName -import com.intellij.python.sdkConfigurator.common.SdkConfiguratorApi +import com.intellij.python.sdkConfigurator.common.impl.ModuleName +import com.intellij.python.sdkConfigurator.common.impl.SdkConfiguratorBackEndApi -internal object SdkConfiguratorApiImpl : SdkConfiguratorApi { +internal object SdkConfiguratorApiImpl : SdkConfiguratorBackEndApi { override suspend fun configureSdkAutomatically(projectId: ProjectId, onlyModules: Set) { configureSdkAutomatically(projectId.findProject(), onlyModules) } diff --git a/python/python-sdk-configurator/common/resources/intellij.python.sdkConfigurator.common.xml b/python/python-sdk-configurator/common/resources/intellij.python.sdkConfigurator.common.xml index 164f46cfcfb2..f7b2a6632b72 100644 --- a/python/python-sdk-configurator/common/resources/intellij.python.sdkConfigurator.common.xml +++ b/python/python-sdk-configurator/common/resources/intellij.python.sdkConfigurator.common.xml @@ -1,2 +1,5 @@ + + + diff --git a/python/python-sdk-configurator/common/src/sdkConfiguratorApi.kt b/python/python-sdk-configurator/common/src/impl/SdkConfiguratorBackEndApi.kt similarity index 81% rename from python/python-sdk-configurator/common/src/sdkConfiguratorApi.kt rename to python/python-sdk-configurator/common/src/impl/SdkConfiguratorBackEndApi.kt index 8b0678ac9f52..ed834bda66c5 100644 --- a/python/python-sdk-configurator/common/src/sdkConfiguratorApi.kt +++ b/python/python-sdk-configurator/common/src/impl/SdkConfiguratorBackEndApi.kt @@ -1,4 +1,4 @@ -package com.intellij.python.sdkConfigurator.common +package com.intellij.python.sdkConfigurator.common.impl import com.intellij.platform.project.ProjectId import com.intellij.platform.rpc.topics.ProjectRemoteTopic @@ -6,8 +6,11 @@ import fleet.rpc.RemoteApi import fleet.rpc.Rpc import kotlinx.serialization.Serializable +/** + * Front calls back + */ @Rpc -interface SdkConfiguratorApi : RemoteApi { +interface SdkConfiguratorBackEndApi : RemoteApi { /*** * Configure SDK for all modules in [projectId] if their names in [onlyModules] */ @@ -17,7 +20,7 @@ interface SdkConfiguratorApi : RemoteApi { typealias ModuleName = String /** - * Ask user to choose from [ModulesDTO] and then call [SdkConfiguratorApi.configureSdkAutomatically] + * Ask user to choose from [ModulesDTO] and then call [SdkConfiguratorBackEndApi.configureSdkAutomatically] */ val SHOW_SDK_CONFIG_UI_TOPIC: ProjectRemoteTopic = ProjectRemoteTopic("PySDKConfigurationUITopic", ModulesDTO.serializer()) diff --git a/python/python-sdk-configurator/common/src/impl/detectModulesImpl.kt b/python/python-sdk-configurator/common/src/impl/detectModulesImpl.kt new file mode 100644 index 000000000000..f6f8a0f3b16f --- /dev/null +++ b/python/python-sdk-configurator/common/src/impl/detectModulesImpl.kt @@ -0,0 +1,10 @@ +package com.intellij.python.sdkConfigurator.common.impl + +import com.intellij.platform.rpc.topics.ProjectRemoteTopic +import kotlinx.serialization.builtins.serializer + +/** + * Backend listens for this topic to start SDK detection process + */ +val DETECT_SDK_FOR_MODULES: ProjectRemoteTopic = ProjectRemoteTopic("PySDKConfigurationDetectSDKTopic", Unit.serializer()) + diff --git a/python/python-sdk-configurator/common/src/impl/package-info.java b/python/python-sdk-configurator/common/src/impl/package-info.java new file mode 100644 index 000000000000..7077cd97274b --- /dev/null +++ b/python/python-sdk-configurator/common/src/impl/package-info.java @@ -0,0 +1,7 @@ +/** + * Front and back shared classes, do not use outside of "sdkConfigurator" + */ +@ApiStatus.Internal +package com.intellij.python.sdkConfigurator.common.impl; + +import org.jetbrains.annotations.ApiStatus; \ No newline at end of file diff --git a/python/python-sdk-configurator/common/src/publicApi.kt b/python/python-sdk-configurator/common/src/publicApi.kt new file mode 100644 index 000000000000..059d91956a12 --- /dev/null +++ b/python/python-sdk-configurator/common/src/publicApi.kt @@ -0,0 +1,24 @@ +package com.intellij.python.sdkConfigurator.common + +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.registry.Registry +import com.intellij.platform.rpc.topics.sendToClient +import com.intellij.python.sdkConfigurator.common.impl.DETECT_SDK_FOR_MODULES + + +/** + * New SDK configurator enabled + */ +val enableSDKAutoConfigurator: Boolean get() = Registry.`is`("intellij.python.sdkConfigurator.auto") + +/** + * Check if [enableSDKAutoConfigurator] (return `false` if not) and start detecting process. + * it might ask user for list of modules and then detect them + */ +fun detectSdkForModulesIn(project: Project): Boolean { + if (!enableSDKAutoConfigurator) { + return false + } + DETECT_SDK_FOR_MODULES.sendToClient(project, Unit) + return true +} diff --git a/python/python-sdk-configurator/frontend/resources/intellij.python.sdkConfigurator.frontend.xml b/python/python-sdk-configurator/frontend/resources/intellij.python.sdkConfigurator.frontend.xml index 40f4a05d1080..0fc3932fa316 100644 --- a/python/python-sdk-configurator/frontend/resources/intellij.python.sdkConfigurator.frontend.xml +++ b/python/python-sdk-configurator/frontend/resources/intellij.python.sdkConfigurator.frontend.xml @@ -12,6 +12,6 @@ + implementation="com.intellij.python.sdkConfigurator.frontend.rpcBridge.FrontendTopicListener"/> diff --git a/python/python-sdk-configurator/frontend/src/frontendLib.kt b/python/python-sdk-configurator/frontend/src/frontendLib.kt index 61d5309f0ea5..95b45dcc0e43 100644 --- a/python/python-sdk-configurator/frontend/src/frontendLib.kt +++ b/python/python-sdk-configurator/frontend/src/frontendLib.kt @@ -2,8 +2,8 @@ package com.intellij.python.sdkConfigurator.frontend import androidx.compose.runtime.mutableStateSetOf import androidx.compose.runtime.snapshots.SnapshotStateSet -import com.intellij.python.sdkConfigurator.common.ModuleName -import com.intellij.python.sdkConfigurator.common.ModulesDTO +import com.intellij.python.sdkConfigurator.common.impl.ModuleName +import com.intellij.python.sdkConfigurator.common.impl.ModulesDTO import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.persistentListOf diff --git a/python/python-sdk-configurator/frontend/src/rpcBridge/TopicListener.kt b/python/python-sdk-configurator/frontend/src/rpcBridge/FrontendTopicListener.kt similarity index 83% rename from python/python-sdk-configurator/frontend/src/rpcBridge/TopicListener.kt rename to python/python-sdk-configurator/frontend/src/rpcBridge/FrontendTopicListener.kt index fa7470958d0b..1c3746efe4d2 100644 --- a/python/python-sdk-configurator/frontend/src/rpcBridge/TopicListener.kt +++ b/python/python-sdk-configurator/frontend/src/rpcBridge/FrontendTopicListener.kt @@ -7,13 +7,13 @@ import com.intellij.openapi.project.Project import com.intellij.platform.project.projectId import com.intellij.platform.rpc.topics.ProjectRemoteTopic import com.intellij.platform.rpc.topics.ProjectRemoteTopicListener -import com.intellij.python.sdkConfigurator.common.ModulesDTO -import com.intellij.python.sdkConfigurator.common.SHOW_SDK_CONFIG_UI_TOPIC +import com.intellij.python.sdkConfigurator.common.impl.ModulesDTO +import com.intellij.python.sdkConfigurator.common.impl.SHOW_SDK_CONFIG_UI_TOPIC import com.intellij.python.sdkConfigurator.frontend.askUser import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -internal class TopicListener : ProjectRemoteTopicListener { +internal class FrontendTopicListener : ProjectRemoteTopicListener { override val topic: ProjectRemoteTopic = SHOW_SDK_CONFIG_UI_TOPIC override fun handleEvent(project: Project, event: ModulesDTO) { diff --git a/python/python-sdk-configurator/frontend/src/rpcBridge/apiObtainer.kt b/python/python-sdk-configurator/frontend/src/rpcBridge/apiObtainer.kt index 23c59fa4a7c0..491afe7a8e3a 100644 --- a/python/python-sdk-configurator/frontend/src/rpcBridge/apiObtainer.kt +++ b/python/python-sdk-configurator/frontend/src/rpcBridge/apiObtainer.kt @@ -1,9 +1,9 @@ package com.intellij.python.sdkConfigurator.frontend.rpcBridge import com.intellij.platform.rpc.RemoteApiProviderService -import com.intellij.python.sdkConfigurator.common.SdkConfiguratorApi +import com.intellij.python.sdkConfigurator.common.impl.SdkConfiguratorBackEndApi import fleet.rpc.remoteApiDescriptor -internal suspend fun getBackendApi() = RemoteApiProviderService.resolve(remoteApiDescriptor()) +internal suspend fun getBackendApi() = RemoteApiProviderService.resolve(remoteApiDescriptor()) diff --git a/python/python-sdk-configurator/frontend/src/swingBridge.kt b/python/python-sdk-configurator/frontend/src/swingBridge.kt index 86185be40d1f..dd2952f78fde 100644 --- a/python/python-sdk-configurator/frontend/src/swingBridge.kt +++ b/python/python-sdk-configurator/frontend/src/swingBridge.kt @@ -3,8 +3,8 @@ package com.intellij.python.sdkConfigurator.frontend import com.intellij.openapi.application.EDT import com.intellij.openapi.project.Project import com.intellij.openapi.ui.DialogWrapper -import com.intellij.python.sdkConfigurator.common.ModuleName -import com.intellij.python.sdkConfigurator.common.ModulesDTO +import com.intellij.python.sdkConfigurator.common.impl.ModuleName +import com.intellij.python.sdkConfigurator.common.impl.ModulesDTO import com.intellij.python.sdkConfigurator.frontend.components.ModuleList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/python/src/com/jetbrains/python/inspections/PyInterpreterInspection.java b/python/src/com/jetbrains/python/inspections/PyInterpreterInspection.java index ed9ecf42ad63..4733613f854b 100644 --- a/python/src/com/jetbrains/python/inspections/PyInterpreterInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyInterpreterInspection.java @@ -45,7 +45,10 @@ import com.jetbrains.python.psi.LanguageLevel; import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.impl.PyBuiltinCache; import com.jetbrains.python.psi.types.TypeEvalContext; -import com.jetbrains.python.sdk.*; +import com.jetbrains.python.sdk.PyDetectedSdk; +import com.jetbrains.python.sdk.PySdkExtKt; +import com.jetbrains.python.sdk.PySdkPopupFactory; +import com.jetbrains.python.sdk.PythonSdkType; import com.jetbrains.python.sdk.conda.PyCondaSdkCustomizer; import com.jetbrains.python.sdk.configuration.PyProjectSdkConfiguration; import com.jetbrains.python.sdk.configuration.PyProjectSdkConfigurationExtension; @@ -69,6 +72,9 @@ import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.intellij.python.sdkConfigurator.common.PublicApiKt.detectSdkForModulesIn; + + public final class PyInterpreterInspection extends PyInspection { private static final @NotNull Logger LOGGER = Logger.getInstance(PyInterpreterInspection.class); @@ -332,7 +338,7 @@ public final class PyInterpreterInspection extends PyInspection { private final @Nullable Module myModule; - public InterpreterSettingsQuickFix(@Nullable Module module) { + public InterpreterSettingsQuickFix(@Nullable Module module) { myModule = module; } @@ -429,7 +435,9 @@ public final class PyInterpreterInspection extends PyInspection { @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { - PyProjectSdkConfiguration.INSTANCE.configureSdkUsingExtension(myModule, myExtension); + if (! detectSdkForModulesIn(project)) { + PyProjectSdkConfiguration.INSTANCE.configureSdkUsingExtension(myModule, myExtension); + } } @Override