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