Revert to directory configurator instead of project listener (PY-39541, PY-39921)

Since it is more clear in what cases the configurator is called and does not lead to overriding interpreter that is going to be created or being created.

GitOrigin-RevId: 76854f469f4d1d63763159ba89ab13b0a1c4754b
This commit is contained in:
Semyon Proshev
2019-12-30 12:40:42 +03:00
committed by intellij-monorepo-bot
parent 9738ebdf05
commit 46faf483e5
2 changed files with 13 additions and 24 deletions

View File

@@ -7,12 +7,6 @@
</component>
</project-components>
<application-components>
<component>
<implementation-class>com.jetbrains.python.PythonSdkConfigurator</implementation-class>
</component>
</application-components>
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceInterface="com.intellij.lang.IdeLanguageCustomization"
serviceImplementation="com.jetbrains.python.PythonIdeLanguageCustomization"
@@ -44,6 +38,8 @@
key="configurable.BuildoutModulesConfigurable.display.name"
instance="com.jetbrains.python.buildout.BuildoutModulesConfigurable"/>
<directoryProjectConfigurator implementation="com.jetbrains.python.PythonSdkConfigurator" id="sdk"
order="after PlatformProjectConfigurator"/>
<directoryProjectConfigurator implementation="com.jetbrains.python.PythonSourceRootConfigurator" id="sourceRoot"
order="after sdk"/>
<directoryProjectConfigurator implementation="com.jetbrains.python.buildout.BuildoutFacetConfigurator" id="buildout"

View File

@@ -6,7 +6,6 @@ import com.intellij.notification.NotificationAction
import com.intellij.notification.NotificationDisplayType
import com.intellij.notification.NotificationGroup
import com.intellij.notification.NotificationType
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.progress.ProgressIndicator
@@ -14,23 +13,23 @@ import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.Task
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.project.ProjectManagerListener
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel
import com.intellij.openapi.util.Ref
import com.intellij.openapi.util.UserDataHolder
import com.intellij.openapi.util.UserDataHolderBase
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.DirectoryProjectConfigurator
import com.intellij.ui.AppUIUtil
import com.jetbrains.python.sdk.*
import com.jetbrains.python.sdk.pipenv.detectAndSetupPipEnv
import java.nio.file.Files
import java.nio.file.Paths
/**
* @author vlan
*/
class PythonSdkConfigurator {
class PythonSdkConfigurator : DirectoryProjectConfigurator {
companion object {
private val BALLOON_NOTIFICATIONS = NotificationGroup("Python interpreter configuring", NotificationDisplayType.BALLOON, true)
@@ -79,25 +78,19 @@ class PythonSdkConfigurator {
}
}
init {
ApplicationManager.getApplication().messageBus.connect().subscribe(ProjectManager.TOPIC, object : ProjectManagerListener {
override fun projectOpened(project: Project) {
ProgressManager.getInstance().run(
object : Task.Backgroundable(project, "Configuring a Python Interpreter", true) {
override fun run(indicator: ProgressIndicator) = configureSdk(project, indicator)
}
)
override fun configureProject(project: Project, baseDir: VirtualFile, moduleRef: Ref<Module>, newProject: Boolean) {
if (project.pythonSdk != null || newProject) return
ProgressManager.getInstance().run(
object : Task.Backgroundable(project, "Configuring a Python Interpreter", true) {
override fun run(indicator: ProgressIndicator) = configureSdk(project, indicator)
}
})
)
}
private fun configureSdk(project: Project, indicator: ProgressIndicator) {
indicator.isIndeterminate = true
if (project.isDefault ||
project.pythonSdk != null ||
project.basePath.let { it != null && Files.exists(Paths.get(it, Project.DIRECTORY_STORE_FOLDER)) }) return
val context = UserDataHolderBase()
val module = ModuleManager.getInstance(project).modules.firstOrNull() ?: return
val existingSdks = ProjectSdksModel().apply { reset(project) }.sdks.filter { it.sdkType is PythonSdkType }