import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.ModuleRootModificationUtil
+import com.intellij.openapi.util.Computable
+ import com.intellij.openapi.util.Disposer
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.util.ui.UIUtil
+import com.jetbrains.python.PythonModuleTypeBase
import com.jetbrains.python.sdk.PythonSdkType
import com.jetbrains.python.sdk.PythonSdkUpdater
import com.jetbrains.python.tools.sdkTools.PySdkTools
}
-fun openProjectWithSdk(projectPath: String, sdkHome: String): Pair<Project?, Sdk?> {
+fun openProjectWithSdk(projectPath: String, sdkHome: String?): Pair<Project?, Sdk?> {
+ println("Opening project at $projectPath")
val project: Project? = ProjectManager.getInstance().loadAndOpenProject(projectPath)
-
+ try {
- val module = ModuleManager.getInstance(project!!).modules[0]
+ val module = getOrCreateModule(project!!, projectPath)
- val sdk = createSdkForPerformance(module, SdkCreationType.SDK_PACKAGES_AND_SKELETONS, sdkHome)
+ val sdk =
+ if (sdkHome != null) {
- val sdk = createSdkForPerformance(module, SdkCreationType.SDK_PACKAGES_AND_SKELETONS, sdkHome)
++ val sdk = createSdkForPerformance(module, SdkCreationType.SDK_PACKAGES_AND_SKELETONS, sdkHome)
+
- UIUtil.invokeAndWaitIfNeeded(Runnable {
- ApplicationManager.getApplication().runWriteAction({
- PythonSdkUpdater.update(sdk, null, project, null)
- })
- })
++ UIUtil.invokeAndWaitIfNeeded(Runnable {
++ ApplicationManager.getApplication().runWriteAction({
++ PythonSdkUpdater.update(sdk, null, project, null)
++ })
++ })
+
- ModuleRootModificationUtil.setModuleSdk(module, sdk)
+
- assert(ModuleRootManager.getInstance(module).orderEntries().classesRoots.size > 5)
++ ModuleRootModificationUtil.setModuleSdk(module, sdk)
- UIUtil.invokeAndWaitIfNeeded(Runnable {
- ApplicationManager.getApplication().runWriteAction({
- PythonSdkUpdater.update(sdk, null, project, null)
- })
- })
+
- if (module != null) {
- ModuleRootModificationUtil.setModuleSdk(module, sdk)
++ assert(ModuleRootManager.getInstance(module).orderEntries().classesRoots.size > 5)
+ sdk
+ }
+ else {
+ null
}
-
- assert(ModuleRootManager.getInstance(module).orderEntries().classesRoots.size > 5)
- assert(ModuleManager.getInstance(project).modules.size == 1)
+ assert(ModuleManager.getInstance(project).modules.size == 1)
- return Pair(project, sdk)
+ return Pair(project, sdk)
+ }
+ catch (e: Throwable) {
+ if (project != null) {
+ UIUtil.invokeAndWaitIfNeeded(Runnable {
+ ProjectManager.getInstance().closeProject(project)
+ WriteAction.run<Throwable> {
+ Disposer.dispose(project)
+ }
+ })
+ }
+ throw e
+ }
+}
+
+fun getOrCreateModule(project: Project, projectPath: String): Module {
+ if (ModuleManager.getInstance(project).modules.isNotEmpty()) {
+ return ModuleManager.getInstance(project).modules[0]
+ }
+ else {
+ val module: Module = ApplicationManager.getApplication().runWriteAction(
+ Computable<Module> { ModuleManager.getInstance(project).newModule(projectPath, PythonModuleTypeBase.PYTHON_MODULE) }
+ )
+
+ val root = VfsUtil.findFileByIoFile(File(projectPath), true)!!
+
+ ModuleRootModificationUtil.updateModel(module, { t ->
+ val e = t.addContentEntry(root)
+ e.addSourceFolder(root, false)
+ })
+
+ return module
+ }
}