diff --git a/python/ide/src/com/jetbrains/python/PythonSdkConfigurator.kt b/python/ide/src/com/jetbrains/python/PythonSdkConfigurator.kt index e8849f830e53..baca0a47095d 100644 --- a/python/ide/src/com/jetbrains/python/PythonSdkConfigurator.kt +++ b/python/ide/src/com/jetbrains/python/PythonSdkConfigurator.kt @@ -39,8 +39,8 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator { private fun findExistingSystemWideSdk(existingSdks: List) = existingSdks.filter { it.isSystemWide }.sortedWith(PreferredSdkComparator.INSTANCE).firstOrNull() - private fun findDetectedSystemWideSdk(existingSdks: List) = - detectSystemWideSdks(existingSdks).firstOrNull() + private fun findDetectedSystemWideSdk(module: Module?, existingSdks: List) = + detectSystemWideSdks(module, existingSdks).firstOrNull() } override fun configureProject(project: Project?, baseDir: VirtualFile, moduleRef: Ref?) { @@ -75,7 +75,7 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator { return } - findDetectedSystemWideSdk(existingSdks)?.let { + findDetectedSystemWideSdk(module, existingSdks)?.let { SdkConfigurationUtil.createAndAddSDK(it.homePath, PythonSdkType.getInstance())?.apply { SdkConfigurationUtil.setDirectoryProjectSdk(project, this) } diff --git a/python/src/com/jetbrains/python/sdk/PySdkExt.kt b/python/src/com/jetbrains/python/sdk/PySdkExt.kt index 83334a43eddc..58c7be96f15a 100644 --- a/python/src/com/jetbrains/python/sdk/PySdkExt.kt +++ b/python/src/com/jetbrains/python/sdk/PySdkExt.kt @@ -47,17 +47,17 @@ import java.nio.file.Paths * @author vlan */ -fun findBaseSdks(existingSdks: List): List { +fun findBaseSdks(existingSdks: List, module: Module?): List { val existing = existingSdks.filter { it.sdkType is PythonSdkType && it.isSystemWide } - val detected = detectSystemWideSdks(existingSdks) + val detected = detectSystemWideSdks(module, existingSdks) return existing + detected } -fun detectSystemWideSdks(existingSdks: List): List { +fun detectSystemWideSdks(module: Module?, existingSdks: List): List { val existingPaths = existingSdks.map { it.homePath }.toSet() return PythonSdkFlavor.getApplicableFlavors(false) .asSequence() - .flatMap { it.suggestHomePaths().asSequence() } + .flatMap { it.suggestHomePaths(module).asSequence() } .filter { it !in existingPaths } .map { PyDetectedSdk(it) } .sortedWith(compareBy({ it.guessedLanguageLevel }, @@ -66,10 +66,10 @@ fun detectSystemWideSdks(existingSdks: List): List { } fun detectVirtualEnvs(module: Module?, existingSdks: List): List = - filterSuggestedPaths(VirtualEnvSdkFlavor.INSTANCE.suggestHomePaths(), existingSdks, module) + filterSuggestedPaths(VirtualEnvSdkFlavor.INSTANCE.suggestHomePaths(module), existingSdks, module) fun detectCondaEnvs(module: Module?, existingSdks: List): List = - filterSuggestedPaths(CondaEnvSdkFlavor.INSTANCE.suggestHomePaths(), existingSdks, module) + filterSuggestedPaths(CondaEnvSdkFlavor.INSTANCE.suggestHomePaths(module), existingSdks, module) fun createSdkByGenerateTask(generateSdkHomePath: Task.WithResult, existingSdks: List, diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java index 07276327ec73..94e3a4448136 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java @@ -147,7 +147,7 @@ public final class PythonSdkType extends SdkType { @Nullable public String suggestHomePath() { final Sdk[] existingSdks = ProjectJdkTable.getInstance().getAllJdks(); - final List sdks = PySdkExtKt.detectSystemWideSdks(Arrays.asList(existingSdks)); + final List sdks = PySdkExtKt.detectSystemWideSdks(null, Arrays.asList(existingSdks)); final PyDetectedSdk latest = StreamEx.of(sdks).findFirst().orElse(null); if (latest != null) { return latest.getHomePath(); diff --git a/python/src/com/jetbrains/python/sdk/add/PyAddNewVirtualEnvPanel.kt b/python/src/com/jetbrains/python/sdk/add/PyAddNewVirtualEnvPanel.kt index a793b0c40211..e2443b13a28d 100644 --- a/python/src/com/jetbrains/python/sdk/add/PyAddNewVirtualEnvPanel.kt +++ b/python/src/com/jetbrains/python/sdk/add/PyAddNewVirtualEnvPanel.kt @@ -62,7 +62,7 @@ class PyAddNewVirtualEnvPanel(private val project: Project?, override val panelName: String = "New environment" override val icon: Icon = PythonIcons.Python.Virtualenv - private val baseSdkField = PySdkPathChoosingComboBox(findBaseSdks(existingSdks), null).apply { + private val baseSdkField = PySdkPathChoosingComboBox(findBaseSdks(existingSdks, module), null).apply { val preferredSdkPath = PySdkSettings.instance.preferredVirtualEnvBaseSdk val detectedPreferredSdk = items.find { it.homePath == preferredSdkPath } selectedSdk = when { diff --git a/python/src/com/jetbrains/python/sdk/add/PyAddSdkDialog.kt b/python/src/com/jetbrains/python/sdk/add/PyAddSdkDialog.kt index 40556fcb56bf..630c5a349280 100644 --- a/python/src/com/jetbrains/python/sdk/add/PyAddSdkDialog.kt +++ b/python/src/com/jetbrains/python/sdk/add/PyAddSdkDialog.kt @@ -76,7 +76,7 @@ class PyAddSdkDialog private constructor(private val project: Project?, .sortedWith(PreferredSdkComparator()) val panels = arrayListOf(createVirtualEnvPanel(project, module, sdks, newProjectPath), createAnacondaPanel(project, module), - PyAddSystemWideInterpreterPanel(existingSdks)) + PyAddSystemWideInterpreterPanel(module, existingSdks)) val extendedPanels = PyAddSdkProvider.EP_NAME.extensions .mapNotNull { it.createView(project = project, module = module, newProjectPath = newProjectPath, existingSdks = existingSdks) diff --git a/python/src/com/jetbrains/python/sdk/add/PyAddSystemWideInterpreterPanel.kt b/python/src/com/jetbrains/python/sdk/add/PyAddSystemWideInterpreterPanel.kt index 5db5a354bf3c..6ffa563970da 100644 --- a/python/src/com/jetbrains/python/sdk/add/PyAddSystemWideInterpreterPanel.kt +++ b/python/src/com/jetbrains/python/sdk/add/PyAddSystemWideInterpreterPanel.kt @@ -15,6 +15,7 @@ */ package com.jetbrains.python.sdk.add +import com.intellij.openapi.module.Module import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.ui.ValidationInfo import com.intellij.ui.components.JBLabel @@ -28,9 +29,9 @@ import java.awt.BorderLayout /** * @author vlan */ -class PyAddSystemWideInterpreterPanel(private val existingSdks: List) : PyAddSdkPanel() { +class PyAddSystemWideInterpreterPanel(module: Module?, private val existingSdks: List) : PyAddSdkPanel() { override val panelName: String = "System interpreter" - private val sdkComboBox = PySdkPathChoosingComboBox(detectSystemWideSdks(existingSdks), null) + private val sdkComboBox = PySdkPathChoosingComboBox(detectSystemWideSdks(module, existingSdks), null) init { layout = BorderLayout() diff --git a/python/src/com/jetbrains/python/sdk/flavors/CondaEnvSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/CondaEnvSdkFlavor.java index b5000f02fa64..01a4a2189296 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/CondaEnvSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/CondaEnvSdkFlavor.java @@ -15,6 +15,7 @@ */ package com.jetbrains.python.sdk.flavors; +import com.intellij.openapi.module.Module; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.StandardFileSystems; @@ -45,7 +46,7 @@ public class CondaEnvSdkFlavor extends CPythonSdkFlavor { public static CondaEnvSdkFlavor INSTANCE = new CondaEnvSdkFlavor(); @Override - public Collection suggestHomePaths() { + public Collection suggestHomePaths(@Nullable Module module) { List candidates = new ArrayList<>(); for (VirtualFile file : getCondaDefaultLocations()) { diff --git a/python/src/com/jetbrains/python/sdk/flavors/IronPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/IronPythonSdkFlavor.java index 306f5126b3ed..5daf2c7693e7 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/IronPythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/IronPythonSdkFlavor.java @@ -16,6 +16,7 @@ package com.jetbrains.python.sdk.flavors; import com.intellij.execution.configurations.GeneralCommandLine; +import com.intellij.openapi.module.Module; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.PatternUtil; import icons.PythonIcons; @@ -39,7 +40,7 @@ public class IronPythonSdkFlavor extends PythonSdkFlavor { public static IronPythonSdkFlavor INSTANCE = new IronPythonSdkFlavor(); @Override - public Collection suggestHomePaths() { + public Collection suggestHomePaths(@Nullable Module module) { Set result = new TreeSet<>(); String root = System.getenv("ProgramFiles(x86)"); if (root == null) { diff --git a/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java index c4951f650428..d73766901c34 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java @@ -15,9 +15,12 @@ */ package com.jetbrains.python.sdk.flavors; +import com.intellij.openapi.module.Module; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; +import org.jetbrains.annotations.Nullable; + import java.util.HashSet; import java.util.Collection; @@ -34,7 +37,7 @@ public class MacPythonSdkFlavor extends CPythonSdkFlavor { private static final String[] POSSIBLE_BINARY_NAMES = {"python", "python2", "python3"}; @Override - public Collection suggestHomePaths() { + public Collection suggestHomePaths(@Nullable Module module) { Set candidates = new HashSet<>(); collectPythonInstallations("/Library/Frameworks/Python.framework/Versions", candidates); collectPythonInstallations("/System/Library/Frameworks/Python.framework/Versions", candidates); diff --git a/python/src/com/jetbrains/python/sdk/flavors/PyRemoteSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/PyRemoteSdkFlavor.java index 2164f51f2b26..3b9eb46bef87 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/PyRemoteSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/PyRemoteSdkFlavor.java @@ -16,6 +16,7 @@ package com.jetbrains.python.sdk.flavors; import com.google.common.collect.Lists; +import com.intellij.openapi.module.Module; import com.intellij.openapi.util.text.StringUtil; import com.intellij.remote.RemoteFile; import icons.PythonIcons; @@ -37,7 +38,7 @@ public class PyRemoteSdkFlavor extends CPythonSdkFlavor { public static PyRemoteSdkFlavor INSTANCE = new PyRemoteSdkFlavor(); @Override - public Collection suggestHomePaths() { + public Collection suggestHomePaths(@Nullable Module module) { return Lists.newArrayList(); } diff --git a/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java index 496a13d13aa7..b02e4f68c939 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java @@ -21,6 +21,7 @@ import com.intellij.execution.process.ProcessOutput; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkAdditionalData; import com.intellij.openapi.util.SystemInfo; @@ -70,7 +71,15 @@ public abstract class PythonSdkFlavor { PythonEnvUtil.addToPythonPath(envs, pythonPathList); } + /** + * @deprecated Use {@link #suggestHomePaths(Module)}. To be removed in 2019.2. + */ + @Deprecated public Collection suggestHomePaths() { + return suggestHomePaths(null); + } + + public Collection suggestHomePaths(@Nullable Module module) { return Collections.emptyList(); } diff --git a/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java index cbedcb715553..6a684e0971c2 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java @@ -15,9 +15,11 @@ */ package com.jetbrains.python.sdk.flavors; +import com.intellij.openapi.module.Module; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; +import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.HashSet; @@ -36,7 +38,7 @@ public class UnixPythonSdkFlavor extends CPythonSdkFlavor { public static final UnixPythonSdkFlavor INSTANCE = new UnixPythonSdkFlavor(); @Override - public Collection suggestHomePaths() { + public Collection suggestHomePaths(@Nullable Module module) { Set candidates = new HashSet<>(); collectUnixPythons("/usr/bin", candidates); return candidates; diff --git a/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java index 217cd3eb83fd..f79ff295d542 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java @@ -15,18 +15,13 @@ */ package com.jetbrains.python.sdk.flavors; -import com.intellij.ide.DataManager; -import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.SystemProperties; -import com.jetbrains.python.PythonModuleTypeBase; import com.jetbrains.python.sdk.PySdkExtKt; import com.jetbrains.python.sdk.PythonSdkType; import icons.PythonIcons; @@ -50,26 +45,25 @@ public class VirtualEnvSdkFlavor extends CPythonSdkFlavor { public static VirtualEnvSdkFlavor INSTANCE = new VirtualEnvSdkFlavor(); @Override - public Collection suggestHomePaths() { - final Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext()); - List candidates = new ArrayList<>(); - if (project != null) { - for (Module module : ModuleUtil.getModulesOfType(project, PythonModuleTypeBase.getInstance())) { - final VirtualFile baseDir = PySdkExtKt.getBaseDir(module); - if (baseDir != null) { - candidates.addAll(findInDirectory(baseDir)); - } + public Collection suggestHomePaths(@Nullable Module module) { + final List candidates = new ArrayList<>(); + if (module != null) { + final VirtualFile baseDir = PySdkExtKt.getBaseDir(module); + if (baseDir != null) { + candidates.addAll(findInDirectory(baseDir)); } } - + final VirtualFile path = getDefaultLocation(); - if (path != null) + if (path != null) { candidates.addAll(findInDirectory(path)); + } final VirtualFile pyEnvLocation = getPyEnvDefaultLocations(); if (pyEnvLocation != null) { candidates.addAll(findInDirectory(pyEnvLocation)); } + return candidates; } diff --git a/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java index 500e41dca53f..a63fa9d74a17 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java @@ -16,6 +16,7 @@ package com.jetbrains.python.sdk.flavors; import com.google.common.collect.ImmutableMap; +import com.intellij.openapi.module.Module; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; @@ -23,6 +24,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.jetbrains.python.PythonHelpersLocator; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.*; @@ -48,7 +50,7 @@ public final class WinPythonSdkFlavor extends CPythonSdkFlavor { } @Override - public Collection suggestHomePaths() { + public Collection suggestHomePaths(@Nullable Module module) { Set candidates = new TreeSet<>(); findInCandidatePaths(candidates, "python.exe", "jython.bat", "pypy.exe"); findInstallations(candidates, "python.exe", PythonHelpersLocator.getHelpersRoot().getParent()); diff --git a/python/src/com/jetbrains/python/sdk/pipenv/PyAddPipEnvPanel.kt b/python/src/com/jetbrains/python/sdk/pipenv/PyAddPipEnvPanel.kt index 463e32a19614..9b4025cd8ce3 100644 --- a/python/src/com/jetbrains/python/sdk/pipenv/PyAddPipEnvPanel.kt +++ b/python/src/com/jetbrains/python/sdk/pipenv/PyAddPipEnvPanel.kt @@ -44,7 +44,7 @@ class PyAddPipEnvPanel(private val project: Project?, private val moduleField: JComboBox - private val baseSdkField = PySdkPathChoosingComboBox(findBaseSdks(existingSdks), null).apply { + private val baseSdkField = PySdkPathChoosingComboBox(findBaseSdks(existingSdks, module), null).apply { val preferredSdkPath = PySdkSettings.instance.preferredVirtualEnvBaseSdk val detectedPreferredSdk = items.find { it.homePath == preferredSdkPath } selectedSdk = when {