Reduce number of cases when interpreter is not configured (PY-39541)

Make PythonSdkConfigurator to be a project listener. It will catch opening project with .idea inside, or from recent projects list, or getting it from vcs.

GitOrigin-RevId: fcf3a7a37b4675670fad654efcc786f9f7fe9df1
This commit is contained in:
Semyon Proshev
2019-12-13 13:31:47 +00:00
committed by intellij-monorepo-bot
parent 5fd558302c
commit 5b0f17f657
2 changed files with 24 additions and 14 deletions
@@ -1,5 +1,5 @@
<!-- Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
<idea-plugin xmlns:xi="http://www.w3.org/2001/XInclude">
<idea-plugin>
<project-components>
<component>
@@ -13,6 +13,12 @@
</component>
</project-components>
<application-components>
<component>
<implementation-class>com.jetbrains.python.PythonSdkConfigurator</implementation-class>
</component>
</application-components>
<extensions defaultExtensionNs="com.intellij">
<projectConfigurable groupId="project"
id="com.jetbrains.python.configuration.PythonContentEntriesConfigurable"
@@ -36,8 +42,6 @@
displayName="Buildout Support"
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"
@@ -1,6 +1,7 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.jetbrains.python
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.progress.ProgressIndicator
@@ -8,24 +9,22 @@ 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.jetbrains.python.sdk.*
import com.jetbrains.python.sdk.pipenv.detectAndSetupPipEnv
/**
* @author vlan
*/
class PythonSdkConfigurator : DirectoryProjectConfigurator {
class PythonSdkConfigurator {
companion object {
fun findExistingAssociatedSdk(module: Module, existingSdks: List<Sdk>): Sdk? {
private fun findExistingAssociatedSdk(module: Module, existingSdks: List<Sdk>): Sdk? {
return existingSdks
.asSequence()
.filter { it.sdkType is PythonSdkType && it.isAssociatedWithModule(module) }
@@ -33,7 +32,7 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator {
.firstOrNull()
}
fun findDetectedAssociatedEnvironment(module: Module, existingSdks: List<Sdk>, context: UserDataHolder): PyDetectedSdk? {
private fun findDetectedAssociatedEnvironment(module: Module, existingSdks: List<Sdk>, context: UserDataHolder): PyDetectedSdk? {
// TODO: Move all interpreter detection away from EDT & use proper synchronization for that
val progress = ProgressManager.getInstance()
return progress.run(object : Task.WithResult<PyDetectedSdk?, Exception>(module.project,
@@ -63,12 +62,19 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator {
detectSystemWideSdks(module, existingSdks, context).firstOrNull()
}
override fun configureProject(project: Project,
baseDir: VirtualFile,
moduleRef: Ref<Module>,
newProject: Boolean) {
init {
ApplicationManager.getApplication().messageBus.connect().subscribe(ProjectManager.TOPIC, object : ProjectManagerListener {
override fun projectOpened(project: Project) {
if (!project.isDefault) {
configureSdk(project)
}
}
})
}
private fun configureSdk(project: Project) {
val context = UserDataHolderBase()
if (project.pythonSdk != null || newProject) {
if (project.pythonSdk != null) {
return
}
val module = ModuleManager.getInstance(project).modules.firstOrNull() ?: return