From e4e49abdd9e34ca9c908f4df4be582589d7bd6e8 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 4 Jun 2020 13:41:33 +0200 Subject: [PATCH] IDEA-229955 PlatformProjectOpenProcessor should use a new unified API to open project (part 2) GitOrigin-RevId: 964d320293c5738f37e56e07ba4b128ab9c0947e --- .../com/intellij/ide/impl/NewProjectUtil.java | 7 +- .../ProjectOpenProcessorBase.java | 76 +++++++------------ .../projectWizard/NewProjectWizardTest.java | 9 +-- .../roots/AutomaticModuleUnloaderTest.kt | 17 ++--- .../projectWizard/ProjectWizardTestCase.java | 20 ++--- .../src/StoreReloadManagerImpl.kt | 2 +- .../testSrc/ProjectStoreTest.kt | 4 +- .../importing/AbstractOpenProjectProvider.kt | 27 ++++--- .../ExternalSystemSetupProjectTest.kt | 4 +- .../ExternalSystemSetupProjectTestCase.kt | 15 ++-- .../codeInspection/InspectionApplication.java | 2 +- .../util/projectWizard/ProjectBuilder.java | 21 +---- .../commandLine/FileSetFormatter.java | 4 +- .../projectWizard/AbstractNewProjectStep.java | 16 ++-- .../projectImport/ProjectAttachProcessor.java | 2 +- .../intellij/ide/RecentProjectsManagerBase.kt | 2 +- .../com/intellij/ide/ReopenProjectAction.java | 2 +- .../ide/actions/NewDummyProjectAction.java | 16 ++-- .../SaveAsDirectoryBasedFormatAction.java | 2 +- .../com/intellij/ide/impl/OpenProjectTask.kt | 54 +++++++------ .../com/intellij/ide/impl/ProjectUtil.java | 23 +++--- .../openapi/project/ex/ProjectManagerEx.java | 17 +---- .../project/impl/ProjectFrameAllocator.kt | 2 +- .../project/impl/ProjectManagerExImpl.kt | 75 ++++++++++-------- .../project/impl/ProjectManagerImpl.java | 9 +-- .../platform/PlatformProjectOpenProcessor.kt | 34 +++++---- .../ui/win/RecentProjectApplication.java | 2 +- .../impl/LightFileTemplatesTest.java | 9 ++- .../impl/EditorHistoryManagerTest.kt | 5 +- .../module/ModulesConfigurationTest.java | 35 +++++---- .../project/impl/ProjectOpeningTest.kt | 7 +- .../openapi/project/ProjectManager.java | 21 ++--- .../com/intellij/testFramework/FixtureRule.kt | 4 +- .../testFramework/HeavyPlatformTestCase.java | 2 +- .../testFramework/PlatformTestUtil.java | 2 +- .../src/com/intellij/util/EmptyConsumer.java | 19 +---- .../openapi/vcs/changes/ChangesUtil.java | 24 +++--- .../intellij/impl/ConversionResultImpl.java | 29 ++++--- .../vcs/changes/actions/EditAction.java | 48 +++++++----- .../checkout/ProjectDirCheckoutListener.java | 2 +- .../workspaceModel/ide/ModuleBridgesTest.kt | 50 ++++++------ .../impl/jps/serialization/jpsTestUtils.kt | 24 ++++-- .../workspaceModel/storage/VirtualFileUrl.kt | 3 +- .../wizard/JavaGradleProjectImportBuilder.kt | 6 +- .../importing/GradleProjectWizardTest.java | 42 +++++----- .../project/GradleProjectOpenProcessor.java | 12 ++- .../maven/wizards/MavenOpenProjectProvider.kt | 6 +- .../maven/wizards/MavenProjectBuilder.java | 19 ++--- .../maven/wizards/MavenImportWizardTest.java | 23 +++--- 49 files changed, 410 insertions(+), 446 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java b/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java index f0f530845068..7143b284ca74 100644 --- a/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java +++ b/java/idea-ui/src/com/intellij/ide/impl/NewProjectUtil.java @@ -111,10 +111,7 @@ public final class NewProjectUtil { if (projectBuilder == null || !projectBuilder.isUpdate()) { String name = wizard.getProjectName(); if (projectBuilder == null) { - OpenProjectTask options = new OpenProjectTask(); - options.useDefaultProjectAsTemplate = true; - options.isNewProject = true; - newProject = projectManager.newProject(projectFile, name, options); + newProject = projectManager.newProject(projectFile, OpenProjectTask.newProject().withProjectName(name)); } else { newProject = projectBuilder.createProject(name, projectFilePath); @@ -169,7 +166,7 @@ public final class NewProjectUtil { if (newProject != projectToClose) { ProjectUtil.updateLastProjectLocation(projectFile); - ProjectManagerEx.getInstanceEx().loadAndOpenProject(projectDir, OpenProjectTask.withCreatedProject(newProject, projectFile)); + ProjectManagerEx.getInstanceEx().openProject(projectDir, OpenProjectTask.withCreatedProject(newProject).withProjectName(projectFile.getFileName().toString())); } if (!ApplicationManager.getApplication().isUnitTestMode()) { diff --git a/java/idea-ui/src/com/intellij/projectImport/ProjectOpenProcessorBase.java b/java/idea-ui/src/com/intellij/projectImport/ProjectOpenProcessorBase.java index 996f066991e6..2cff06bf2621 100644 --- a/java/idea-ui/src/com/intellij/projectImport/ProjectOpenProcessorBase.java +++ b/java/idea-ui/src/com/intellij/projectImport/ProjectOpenProcessorBase.java @@ -2,7 +2,6 @@ package com.intellij.projectImport; import com.intellij.CommonBundle; -import com.intellij.ide.GeneralSettings; import com.intellij.ide.IdeBundle; import com.intellij.ide.JavaUiBundle; import com.intellij.ide.highlighter.ProjectFileType; @@ -12,6 +11,7 @@ import com.intellij.ide.impl.ProjectUtil; import com.intellij.ide.util.projectWizard.WizardContext; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.StorageScheme; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ex.ProjectManagerEx; @@ -177,49 +177,29 @@ public abstract class ProjectOpenProcessorBase JavaUiBundle.message("project.import.open.existing.reimport"), CommonBundle.getCancelButtonText(), Messages.getQuestionIcon()); - if (result == Messages.CANCEL) return null; + if (result == Messages.CANCEL) { + return null; + } shouldOpenExisting = result == Messages.YES; importToProject = !shouldOpenExisting; } } - ProjectUtil.updateLastProjectLocation(pathToOpen); - - OpenProjectTask options = shouldOpenExisting ? new OpenProjectTask(forceOpenInNewFrame, projectToClose) : OpenProjectTask.newProject(true) - .withProjectName(wizardContext.getProjectName()); + OpenProjectTask options = shouldOpenExisting ? OpenProjectTask.withProjectToClose(projectToClose, forceOpenInNewFrame) : OpenProjectTask.newProject(); if (importToProject) { - options.withBeforeProjectCallback((project, module) -> importToProject(projectToClose, wizardContext, project)); + options.withBeforeProjectCallback(project -> importToProject(projectToClose, wizardContext, project)); } + options.withProjectName(wizardContext.getProjectName()); - Project projectToOpen; - if (shouldOpenExisting) { - try { - projectToOpen = ProjectManagerEx.getInstanceEx().loadAndOpenProject(pathToOpen, options); - } - catch (Exception e) { - return null; - } + try { + Project project = ProjectManagerEx.getInstanceEx().openProject(pathToOpen, options); + ProjectUtil.updateLastProjectLocation(pathToOpen); + return project; } - else { - projectToOpen = ProjectManagerEx.getInstanceEx().newProject(pathToOpen, options); - if (projectToOpen == null || !importToProject(projectToClose, wizardContext, projectToOpen)) { - return null; - } - - if (!forceOpenInNewFrame) { - Project[] openProjects = ProjectUtil.getOpenProjects(); - if (openProjects.length > 0) { - int exitCode = ProjectUtil.confirmOpenNewProject(true); - if (exitCode == GeneralSettings.OPEN_PROJECT_SAME_WINDOW) { - Project project = projectToClose != null ? projectToClose : openProjects[openProjects.length - 1]; - ProjectManagerEx.getInstanceEx().closeAndDispose(project); - } - } - } - - ProjectManagerEx.getInstanceEx().openProject(projectToOpen); + catch (Exception e) { + Logger.getInstance(ProjectOpenProcessorBase.class).warn(e); + return null; } - return projectToOpen; } finally { getBuilder().cleanup(); @@ -233,21 +213,23 @@ public abstract class ProjectOpenProcessorBase projectToOpen.save(); - ApplicationManager.getApplication().runWriteAction(() -> { - Sdk jdk1 = wizardContext.getProjectJdk(); - if (jdk1 != null) { - NewProjectUtil.applyJdkToProject(projectToOpen, jdk1); - } + ApplicationManager.getApplication().invokeAndWait(() -> { + ApplicationManager.getApplication().runWriteAction(() -> { + Sdk jdk1 = wizardContext.getProjectJdk(); + if (jdk1 != null) { + NewProjectUtil.applyJdkToProject(projectToOpen, jdk1); + } - String projectDirPath = wizardContext.getProjectFileDirectory(); - String path = projectDirPath + (StringUtil.endsWithChar(projectDirPath, '/') ? "classes" : "/classes"); - CompilerProjectExtension extension = CompilerProjectExtension.getInstance(projectToOpen); - if (extension != null) { - extension.setCompilerOutputUrl(getUrl(path)); - } + String projectDirPath = wizardContext.getProjectFileDirectory(); + String path = projectDirPath + (StringUtil.endsWithChar(projectDirPath, '/') ? "classes" : "/classes"); + CompilerProjectExtension extension = CompilerProjectExtension.getInstance(projectToOpen); + if (extension != null) { + extension.setCompilerOutputUrl(getUrl(path)); + } + }); + + getBuilder().commit(projectToOpen, null, ModulesProvider.EMPTY_MODULES_PROVIDER); }); - - getBuilder().commit(projectToOpen, null, ModulesProvider.EMPTY_MODULES_PROVIDER); return true; } diff --git a/java/idea-ui/testSrc/com/intellij/ide/projectWizard/NewProjectWizardTest.java b/java/idea-ui/testSrc/com/intellij/ide/projectWizard/NewProjectWizardTest.java index 1cd351efe3d7..f4b60a39dd10 100644 --- a/java/idea-ui/testSrc/com/intellij/ide/projectWizard/NewProjectWizardTest.java +++ b/java/idea-ui/testSrc/com/intellij/ide/projectWizard/NewProjectWizardTest.java @@ -1,4 +1,4 @@ -// 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. +// Copyright 2000-2020 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.intellij.ide.projectWizard; import com.intellij.execution.RunManager; @@ -20,7 +20,6 @@ import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.pom.java.LanguageLevel; import com.intellij.testFramework.IdeaTestUtil; -import com.intellij.util.EmptyConsumer; import java.util.List; @@ -68,7 +67,7 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { } public void testChangeSdk() throws Exception { - Project project = createProject(EmptyConsumer.getInstance()); + Project project = createProject(step -> {}); Sdk jdk17 = IdeaTestUtil.getMockJdk17(); addSdk(jdk17); setProjectSdk(project, jdk17); @@ -86,7 +85,7 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { defaultExt.setLanguageLevel(LanguageLevel.JDK_1_4); defaultExt.setDefault(null); // emulate migration from previous build - Project project = createProject(EmptyConsumer.getInstance()); + Project project = createProject(step -> {}); LanguageLevelProjectExtension extension = LanguageLevelProjectExtension.getInstance(project); Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk(); JavaSdkVersion version = JavaSdk.getInstance().getVersion(sdk); @@ -116,7 +115,7 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { try { LanguageLevelProjectExtension.getInstance(defaultProject).setLanguageLevel(languageLevel); LanguageLevelProjectExtension.getInstance(defaultProject).setDefault(detect); - Project project = createProject(EmptyConsumer.getInstance()); + Project project = createProject(step -> {}); assertEquals(languageLevel, LanguageLevelProjectExtension.getInstance(project).getLanguageLevel()); return project; } diff --git a/java/java-tests/testSrc/com/intellij/roots/AutomaticModuleUnloaderTest.kt b/java/java-tests/testSrc/com/intellij/roots/AutomaticModuleUnloaderTest.kt index 35c615b9537d..3398529b6899 100644 --- a/java/java-tests/testSrc/com/intellij/roots/AutomaticModuleUnloaderTest.kt +++ b/java/java-tests/testSrc/com/intellij/roots/AutomaticModuleUnloaderTest.kt @@ -7,12 +7,10 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.StdModuleTypes import com.intellij.openapi.project.Project -import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.project.ex.ProjectManagerEx import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.JDOMUtil -import com.intellij.openapi.util.io.systemIndependentPath import com.intellij.openapi.vfs.VfsUtil import com.intellij.testFramework.* import com.intellij.testFramework.UsefulTestCase.assertSameElements @@ -24,6 +22,7 @@ import org.junit.ClassRule import org.junit.Rule import org.junit.Test import java.io.File +import java.nio.file.Path import java.nio.file.Paths @RunsInEdt @@ -148,21 +147,21 @@ class AutomaticModuleUnloaderTest { } private fun createProject(): Project { - return ProjectManager.getInstance().createProject(null, tempDir.newPath("automaticReloaderTest").systemIndependentPath)!! + return ProjectManagerEx.getInstanceEx().newProject(tempDir.newPath("automaticReloaderTest"), createTestOpenProjectOptions())!! } private fun createModule(project: Project, moduleName: String): Module { return runWriteAction { ModuleManager.getInstance(project).newModule("${project.basePath}/$moduleName.iml", "JAVA") } } - private fun createNewModuleFiles(moduleNames: List, setup: (Map) -> Unit): List { - val newModulesProjectDir = tempDir.newPath("newModules").toFile() - val moduleFiles = moduleNames.map { File(newModulesProjectDir, "$it.iml") } - val project = ProjectManager.getInstance().createProject("newModules", newModulesProjectDir.absolutePath)!! + private fun createNewModuleFiles(moduleNames: List, setup: (Map) -> Unit): List { + val newModulesProjectDir = tempDir.newPath("newModules") + val moduleFiles = moduleNames.map { newModulesProjectDir.resolve("$it.iml") } + val project = ProjectManagerEx.getInstanceEx().newProject(newModulesProjectDir, createTestOpenProjectOptions())!! try { runWriteAction { moduleFiles.map { - ModuleManager.getInstance(project).newModule(it.absolutePath, StdModuleTypes.JAVA.id) + ModuleManager.getInstance(project).newModule(it.toAbsolutePath().toString(), StdModuleTypes.JAVA.id) } } setup(ModuleManager.getInstance(project).modules.associateBy { it.name }) @@ -178,7 +177,7 @@ class AutomaticModuleUnloaderTest { ProjectManagerEx.getInstanceEx().forceCloseProject(project) } - private fun reloadProjectWithNewModules(project: Project, moduleFiles: List, beforeReload: () -> Unit = {}): Project { + private fun reloadProjectWithNewModules(project: Project, moduleFiles: List, beforeReload: () -> Unit = {}): Project { saveAndCloseProject(project) val modulesXmlFile = File(project.basePath, ".idea/modules.xml") val rootElement = JDOMUtil.load(modulesXmlFile) diff --git a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java index 5aaebba3e553..159b733e96ab 100644 --- a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java +++ b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java @@ -1,4 +1,4 @@ -// 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. +// Copyright 2000-2020 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.intellij.ide.projectWizard; import com.intellij.ide.actions.ImportModuleAction; @@ -157,13 +157,14 @@ public abstract class ProjectWizardTestCase ext private static class CancelWizardException extends RuntimeException { } - private void runWizard(@Nullable Consumer adjuster) { + private void runWizard(@Nullable java.util.function.Consumer adjuster) { while (true) { ModuleWizardStep currentStep = myWizard.getCurrentStepObject(); if (adjuster != null) { try { - adjuster.consume(currentStep); - } catch (CancelWizardException e) { + adjuster.accept(currentStep); + } + catch (CancelWizardException e) { myWizard.doCancelAction(); return; } @@ -190,7 +191,7 @@ public abstract class ProjectWizardTestCase ext UIUtil.dispatchAllInvocationEvents(); // to make default selection applied } - protected Project createProject(Consumer adjuster) throws IOException { + protected Project createProject(java.util.function.Consumer adjuster) throws IOException { createWizard(null); runWizard(adjuster); myCreatedProject = NewProjectUtil.createFromWizard(myWizard); @@ -219,7 +220,7 @@ public abstract class ProjectWizardTestCase ext return importFrom(path, getProject(), null, provider); } - protected Module importProjectFrom(String path, Consumer adjuster, ProjectImportProvider... providers) { + protected Module importProjectFrom(String path, java.util.function.Consumer adjuster, ProjectImportProvider... providers) { Module module = importFrom(path, null, adjuster, providers); if (module != null) { myCreatedProject = module.getProject(); @@ -228,12 +229,13 @@ public abstract class ProjectWizardTestCase ext } private Module importFrom(String path, - @Nullable Project project, Consumer adjuster, - final ProjectImportProvider... providers) { + @Nullable Project project, + java.util.function.Consumer adjuster, + ProjectImportProvider... providers) { return computeInWriteSafeContext(() -> doImportModule(path, project, adjuster, providers)); } - private Module doImportModule(String path, @Nullable Project project, Consumer adjuster, ProjectImportProvider[] providers) { + private Module doImportModule(String path, @Nullable Project project, java.util.function.Consumer adjuster, ProjectImportProvider[] providers) { VirtualFile file = LocalFileSystem.getInstance().refreshAndFindFileByPath(path); assertNotNull("Can't find " + path, file); assertTrue(providers[0].canImport(file, project)); diff --git a/platform/configuration-store-impl/src/StoreReloadManagerImpl.kt b/platform/configuration-store-impl/src/StoreReloadManagerImpl.kt index 9d3c2e333bb4..c9d7f5b8e431 100644 --- a/platform/configuration-store-impl/src/StoreReloadManagerImpl.kt +++ b/platform/configuration-store-impl/src/StoreReloadManagerImpl.kt @@ -365,6 +365,6 @@ private fun doReloadProject(project: Project) { return@submit } - ProjectManagerEx.getInstanceEx().loadAndOpenProject(Paths.get(presentableUrl), OpenProjectTask()) + ProjectManagerEx.getInstanceEx().openProject(Paths.get(presentableUrl), OpenProjectTask()) } } \ No newline at end of file diff --git a/platform/configuration-store-impl/testSrc/ProjectStoreTest.kt b/platform/configuration-store-impl/testSrc/ProjectStoreTest.kt index 1aebb898f2b7..617a4988d788 100644 --- a/platform/configuration-store-impl/testSrc/ProjectStoreTest.kt +++ b/platform/configuration-store-impl/testSrc/ProjectStoreTest.kt @@ -2,6 +2,7 @@ package com.intellij.configurationStore import com.intellij.ide.highlighter.ProjectFileType +import com.intellij.ide.impl.OpenProjectTask import com.intellij.openapi.application.runInEdt import com.intellij.openapi.components.* import com.intellij.openapi.project.Project @@ -17,7 +18,6 @@ import com.intellij.testFramework.assertions.Assertions.assertThat import com.intellij.util.PathUtil import com.intellij.util.io.readChars import com.intellij.util.io.readText -import com.intellij.util.io.systemIndependentPath import com.intellij.util.io.write import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -246,7 +246,7 @@ internal class ProjectStoreTest { (projectManager.defaultProject as ComponentManager).stateStore.initComponent(testComponent, null, null) val newProjectPath = tempDirManager.newPath() - val newProject = projectManager.newProject("foo", newProjectPath.systemIndependentPath, true, false)!! + val newProject = projectManager.openProject(newProjectPath, OpenProjectTask(isNewProject = true, isRefreshVfsNeeded = false))!! try { val miscXml = newProjectPath.resolve(".idea/misc.xml").readChars() assertThat(miscXml).contains("AATestComponent") diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/importing/AbstractOpenProjectProvider.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/importing/AbstractOpenProjectProvider.kt index fb4383e65c0f..40a2b3a04ebc 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/importing/AbstractOpenProjectProvider.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/importing/AbstractOpenProjectProvider.kt @@ -16,6 +16,7 @@ import com.intellij.util.io.exists import org.jetbrains.annotations.ApiStatus import java.nio.file.InvalidPathException import java.nio.file.Paths +import java.util.function.Predicate @ApiStatus.Experimental abstract class AbstractOpenProjectProvider : OpenProjectProvider { @@ -34,16 +35,21 @@ abstract class AbstractOpenProjectProvider : OpenProjectProvider { if (focusOnOpenedSameProject(projectDirectory.path)) { return null } - if (canOpenPlatformProject(projectDirectory)) { + else if (canOpenPlatformProject(projectDirectory)) { return openPlatformProject(projectDirectory, projectToClose, forceOpenInNewFrame) } - val project = createProject(projectDirectory) ?: return null - linkAndRefreshProject(projectDirectory.path, project) - val path = projectDirectory.toNioPath() - updateLastProjectLocation(path) - ProjectManagerEx.getInstanceEx().loadAndOpenProject(path, OpenProjectTask(forceOpenInNewFrame = forceOpenInNewFrame, projectToClose = projectToClose, project = project)) - return project + val options = OpenProjectTask(isNewProject = true, + forceOpenInNewFrame = forceOpenInNewFrame, + projectToClose = projectToClose, + runConfigurators = false, + beforeProjectOpen = Predicate { project -> + project.putUserData(ExternalSystemDataKeys.NEWLY_IMPORTED_PROJECT, true) + linkAndRefreshProject(projectDirectory.path, project) + updateLastProjectLocation(projectDirectory.toNioPath()) + true + }) + return ProjectManagerEx.getInstanceEx().openProject(projectDirectory.toNioPath(), options) } override fun linkToExistingProject(projectFile: VirtualFile, project: Project) { @@ -96,13 +102,6 @@ abstract class AbstractOpenProjectProvider : OpenProjectProvider { return file } - private fun createProject(projectDirectory: VirtualFile): Project? { - val projectManager = ProjectManagerEx.getInstanceEx() - val project = projectManager.createProject(projectDirectory.name, projectDirectory.path) - project?.putUserData(ExternalSystemDataKeys.NEWLY_IMPORTED_PROJECT, true) - return project - } - companion object { protected val LOG = Logger.getInstance(AbstractOpenProjectProvider::class.java) } diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/importing/ExternalSystemSetupProjectTest.kt b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/importing/ExternalSystemSetupProjectTest.kt index 4352b09ba48a..b9dfe753faac 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/importing/ExternalSystemSetupProjectTest.kt +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/importing/ExternalSystemSetupProjectTest.kt @@ -1,11 +1,9 @@ -// 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. +// Copyright 2000-2020 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.intellij.openapi.externalSystem.importing -import com.intellij.openapi.externalSystem.util.use import org.junit.Test interface ExternalSystemSetupProjectTest : ExternalSystemSetupProjectTestCase { - @Test fun `test project open`() { val projectInfo = generateProject("A") diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/importing/ExternalSystemSetupProjectTestCase.kt b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/importing/ExternalSystemSetupProjectTestCase.kt index 4cf2e97f171b..c3046668a28f 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/importing/ExternalSystemSetupProjectTestCase.kt +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/importing/ExternalSystemSetupProjectTestCase.kt @@ -1,8 +1,8 @@ -// 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. +// Copyright 2000-2020 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.intellij.openapi.externalSystem.importing -import com.intellij.openapi.externalSystem.util.use as utilUse import com.intellij.ide.actions.ImportModuleAction +import com.intellij.ide.impl.OpenProjectTask import com.intellij.ide.impl.ProjectUtil import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.CommonDataKeys @@ -17,17 +17,17 @@ import com.intellij.openapi.fileChooser.impl.FileChooserFactoryImpl import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager +import com.intellij.openapi.project.ex.ProjectManagerEx import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.use import com.intellij.openapi.vfs.VirtualFile -import com.intellij.platform.PlatformProjectOpenProcessor import com.intellij.testFramework.TestActionEvent import com.intellij.testFramework.replaceService import org.junit.Assert.assertEquals import java.awt.Component +import com.intellij.openapi.externalSystem.util.use as utilUse interface ExternalSystemSetupProjectTestCase { - data class ProjectInfo(val projectFile: VirtualFile, val modules: List) { constructor(projectFile: VirtualFile, vararg modules: String) : this(projectFile, modules.toList()) } @@ -53,10 +53,9 @@ interface ExternalSystemSetupProjectTestCase { fun waitForImportCompletion(project: Project) fun openPlatformProjectFrom(projectDirectory: VirtualFile): Project { - return invokeAndWaitIfNeeded { - val openProcessor = PlatformProjectOpenProcessor.getInstance() - openProcessor.doOpenProject(projectDirectory, null, true)!! - } + return ProjectManagerEx.getInstanceEx().openProject(projectDirectory.toNioPath(), OpenProjectTask(forceOpenInNewFrame = true, + useDefaultProjectAsTemplate = false, + isRefreshVfsNeeded = false))!! } fun openProjectFrom(projectFile: VirtualFile): Project { diff --git a/platform/inspect/src/com/intellij/codeInspection/InspectionApplication.java b/platform/inspect/src/com/intellij/codeInspection/InspectionApplication.java index 6f21ae04c1b8..b12e7f384743 100644 --- a/platform/inspect/src/com/intellij/codeInspection/InspectionApplication.java +++ b/platform/inspect/src/com/intellij/codeInspection/InspectionApplication.java @@ -204,7 +204,7 @@ public final class InspectionApplication implements CommandLineInspectionProgres } } - Project project = ProjectUtil.openOrImport(projectPath, null, false); + Project project = ProjectUtil.openOrImport(projectPath); if (project == null) { reportError("Unable to open project"); gracefulExit(); diff --git a/platform/lang-api/src/com/intellij/ide/util/projectWizard/ProjectBuilder.java b/platform/lang-api/src/com/intellij/ide/util/projectWizard/ProjectBuilder.java index 95258b0cac4a..33f1fcb87a31 100644 --- a/platform/lang-api/src/com/intellij/ide/util/projectWizard/ProjectBuilder.java +++ b/platform/lang-api/src/com/intellij/ide/util/projectWizard/ProjectBuilder.java @@ -1,19 +1,4 @@ -/* - * Copyright 2000-2019 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - +// Copyright 2000-2020 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.intellij.ide.util.projectWizard; import com.intellij.openapi.module.ModifiableModuleModel; @@ -30,7 +15,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; public abstract class ProjectBuilder { - public boolean isUpdate() { return false; } @@ -71,8 +55,7 @@ public abstract class ProjectBuilder { return true; } - @Nullable - public Project createProject(String name, String path) { + public @Nullable Project createProject(String name, String path) { return ProjectManager.getInstance().createProject(name, path); } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/formatting/commandLine/FileSetFormatter.java b/platform/lang-impl/src/com/intellij/formatting/commandLine/FileSetFormatter.java index 4519c47fa2ec..b1bd55f20a22 100644 --- a/platform/lang-impl/src/com/intellij/formatting/commandLine/FileSetFormatter.java +++ b/platform/lang-impl/src/com/intellij/formatting/commandLine/FileSetFormatter.java @@ -58,10 +58,8 @@ public final class FileSetFormatter extends FileSetProcessor { } private void createProject() throws IOException { - ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx(); - myProject = projectManager.newProject(createProjectDir(), myProjectUID, OpenProjectTask.newProject(true)); + myProject = ProjectManagerEx.getInstanceEx().openProject(createProjectDir(), OpenProjectTask.newProject()); if (myProject != null) { - projectManager.openProject(myProject); CodeStyle.setMainProjectSettings(myProject, mySettings); } } diff --git a/platform/lang-impl/src/com/intellij/ide/util/projectWizard/AbstractNewProjectStep.java b/platform/lang-impl/src/com/intellij/ide/util/projectWizard/AbstractNewProjectStep.java index 30d144658485..b589cd6791f4 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/projectWizard/AbstractNewProjectStep.java +++ b/platform/lang-impl/src/com/intellij/ide/util/projectWizard/AbstractNewProjectStep.java @@ -12,6 +12,7 @@ import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; @@ -26,7 +27,6 @@ import com.intellij.platform.*; import com.intellij.platform.templates.ArchivedTemplatesFactory; import com.intellij.platform.templates.LocalArchivedTemplate; import com.intellij.platform.templates.TemplateProjectDirectoryGenerator; -import com.intellij.projectImport.ProjectOpenedCallback; import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -203,17 +203,15 @@ public abstract class AbstractNewProjectStep extends DefaultActionGroup imple RecentProjectsManager.getInstance().setLastProjectCreationLocation(location.getParent()); - ProjectOpenedCallback callback = null; if (generator instanceof TemplateProjectDirectoryGenerator) { ((TemplateProjectDirectoryGenerator)generator).generateProject(baseDir.getName(), locationString); } - else if (generator != null) { - callback = (p, module) -> { - generator.generateProject(p, baseDir, settings, module); - }; - } - OpenProjectTask options = OpenProjectTask.newProjectWithCallback(projectToClose, callback, /* isRefreshVfsNeeded = */ false); - return ProjectManagerEx.getInstanceEx().loadAndOpenProject(location, options); + OpenProjectTask options = OpenProjectTask.newProjectAndRunConfigurators(projectToClose, /* isRefreshVfsNeeded = */ false); + Project project = ProjectManagerEx.getInstanceEx().openProject(location, options); + if (project != null && generator != null) { + generator.generateProject(project, baseDir, settings, ModuleManager.getInstance(project).getModules()[0]); + } + return project; } } \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/projectImport/ProjectAttachProcessor.java b/platform/platform-api/src/com/intellij/projectImport/ProjectAttachProcessor.java index 704698174067..fb3b6a95fe25 100644 --- a/platform/platform-api/src/com/intellij/projectImport/ProjectAttachProcessor.java +++ b/platform/platform-api/src/com/intellij/projectImport/ProjectAttachProcessor.java @@ -30,6 +30,6 @@ public class ProjectAttachProcessor { public void beforeDetach(@NotNull Module module) {} public static boolean canAttachToProject() { - return EP_NAME.getPoint().size() != 0; + return EP_NAME.hasAnyExtensions(); } } diff --git a/platform/platform-impl/src/com/intellij/ide/RecentProjectsManagerBase.kt b/platform/platform-impl/src/com/intellij/ide/RecentProjectsManagerBase.kt index 2f39fe39fec2..5c3b830d5c9c 100644 --- a/platform/platform-impl/src/com/intellij/ide/RecentProjectsManagerBase.kt +++ b/platform/platform-impl/src/com/intellij/ide/RecentProjectsManagerBase.kt @@ -304,7 +304,7 @@ open class RecentProjectsManagerBase : RecentProjectsManager(), PersistentStateC return when { existing != null -> existing ProjectUtil.isValidProjectPath(projectFile) -> { - ProjectManagerEx.getInstanceEx().loadAndOpenProject(projectFile, openProjectOptions) + ProjectManagerEx.getInstanceEx().openProject(projectFile, openProjectOptions) } else -> { // If .idea is missing in the recent project's dir; this might mean, for instance, that 'git clean' was called. diff --git a/platform/platform-impl/src/com/intellij/ide/ReopenProjectAction.java b/platform/platform-impl/src/com/intellij/ide/ReopenProjectAction.java index bfd59fe0ee50..140996fe27b2 100644 --- a/platform/platform-impl/src/com/intellij/ide/ReopenProjectAction.java +++ b/platform/platform-impl/src/com/intellij/ide/ReopenProjectAction.java @@ -59,7 +59,7 @@ public class ReopenProjectAction extends AnAction implements DumbAware { boolean forceOpenInNewFrame = BitUtil.isSet(modifiers, InputEvent.CTRL_MASK) || BitUtil.isSet(modifiers, InputEvent.SHIFT_MASK) || e.getPlace() == ActionPlaces.WELCOME_SCREEN; - RecentProjectsManagerBase.getInstanceEx().openProject(file, new OpenProjectTask(forceOpenInNewFrame, project)); + RecentProjectsManagerBase.getInstanceEx().openProject(file, OpenProjectTask.withProjectToClose(project, forceOpenInNewFrame)); } @SystemIndependent diff --git a/platform/platform-impl/src/com/intellij/ide/actions/NewDummyProjectAction.java b/platform/platform-impl/src/com/intellij/ide/actions/NewDummyProjectAction.java index 25d0923f7f76..b226b2c5e1be 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/NewDummyProjectAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/NewDummyProjectAction.java @@ -1,25 +1,19 @@ -// Copyright 2000-2018 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. +// Copyright 2000-2020 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.intellij.ide.actions; +import com.intellij.ide.impl.OpenProjectTask; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.util.PlatformUtils; import org.jetbrains.annotations.NotNull; -/** - * @author yole - */ -public class NewDummyProjectAction extends AnAction implements DumbAware { +final class NewDummyProjectAction extends AnAction implements DumbAware { @Override - public void actionPerformed(@NotNull final AnActionEvent e) { - final ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx(); - Project project = projectManager.newProject("dummy", PathManager.getConfigPath() + "/dummy.ipr", true, false); - if (project == null) return; - projectManager.openProject(project); + public void actionPerformed(@NotNull AnActionEvent e) { + ProjectManagerEx.getInstanceEx().openProject(PathManager.getConfigDir().resolve("dummy.ipr"), OpenProjectTask.newProject()); } @Override diff --git a/platform/platform-impl/src/com/intellij/ide/actions/SaveAsDirectoryBasedFormatAction.java b/platform/platform-impl/src/com/intellij/ide/actions/SaveAsDirectoryBasedFormatAction.java index 38aa73957631..6960ac6946fe 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/SaveAsDirectoryBasedFormatAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/SaveAsDirectoryBasedFormatAction.java @@ -55,7 +55,7 @@ public final class SaveAsDirectoryBasedFormatAction extends AnAction implements // closeAndDispose will also force save project ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx(); projectManager.closeAndDispose(project); - projectManager.loadAndOpenProject(ideaDir.getParent(), new OpenProjectTask()); + projectManager.openProject(ideaDir.getParent(), new OpenProjectTask()); } catch (IOException e) { Messages.showErrorDialog(project, String.format("Unable to create '.idea' directory (%s): " + e.getMessage(), ideaDir), diff --git a/platform/platform-impl/src/com/intellij/ide/impl/OpenProjectTask.kt b/platform/platform-impl/src/com/intellij/ide/impl/OpenProjectTask.kt index 87bb7b13fcf3..feb07039dc44 100644 --- a/platform/platform-impl/src/com/intellij/ide/impl/OpenProjectTask.kt +++ b/platform/platform-impl/src/com/intellij/ide/impl/OpenProjectTask.kt @@ -1,19 +1,20 @@ // Copyright 2000-2020 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.intellij.ide.impl -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.wm.impl.FrameInfo import com.intellij.projectImport.ProjectOpenedCallback import org.jetbrains.annotations.ApiStatus -import java.nio.file.Path -import java.util.function.BiPredicate +import java.util.function.Predicate -data class OpenProjectTask(@JvmField val forceOpenInNewFrame: Boolean = false, - @JvmField val projectToClose: Project? = null, - @JvmField var useDefaultProjectAsTemplate: Boolean = true, - @JvmField var isNewProject: Boolean = false, +data class OpenProjectTask(val forceOpenInNewFrame: Boolean = false, + val projectToClose: Project? = null, + val isNewProject: Boolean = false, + /** + * Ignored if isNewProject is set to false. + */ + val useDefaultProjectAsTemplate: Boolean = isNewProject, /** * Prepared project to open. If you just need to open newly created and prepared project (e.g. used by a new project action). */ @@ -26,48 +27,51 @@ data class OpenProjectTask(@JvmField val forceOpenInNewFrame: Boolean = false, val showWelcomeScreen: Boolean = true, @set:Deprecated(message = "Pass to constructor", level = DeprecationLevel.ERROR) var callback: ProjectOpenedCallback? = null, - val beforeProjectOpen: BiPredicate? = null, + /** + * Ignored if project is explicitly set. + */ + internal val beforeProjectOpen: Predicate? = null, + internal val preparedToOpen: ((Module) -> Unit)? = null, val frame: FrameInfo? = null, val projectWorkspaceId: String? = null, val line: Int = -1, val column: Int = -1, val isRefreshVfsNeeded: Boolean = true, /** - * Used to build presentable name of project or as content root for a dummy project. + * Whether to run DirectoryProjectConfigurator if a new project or no modules. */ - val contentRoot: Path? = null, - /** - * Ignored if isNewProject is set to true. - */ - val runConfiguratorsIfNoModules: Boolean = !(ApplicationManager.getApplication()?.isUnitTestMode ?: false), + val runConfigurators: Boolean = false, val runConversionBeforeOpen: Boolean = true) { - constructor(forceOpenInNewFrame: Boolean, projectToClose: Project?) : this(forceOpenInNewFrame = forceOpenInNewFrame, projectToClose = projectToClose, useDefaultProjectAsTemplate = true) - @ApiStatus.Internal - fun withBeforeProjectCallback(callback: BiPredicate) = copy(beforeProjectOpen = callback) + fun withBeforeProjectCallback(callback: Predicate) = copy(beforeProjectOpen = callback) @ApiStatus.Internal fun withProjectName(value: String?) = copy(projectName = value) + @ApiStatus.Internal + fun withNewProject(value: Boolean) = copy(isNewProject = value) + companion object { @JvmStatic - fun newProject(useDefaultProjectAsTemplate: Boolean): OpenProjectTask { - return OpenProjectTask(useDefaultProjectAsTemplate = useDefaultProjectAsTemplate, isNewProject = true) + @JvmOverloads + fun newProject(runConfigurators: Boolean = false): OpenProjectTask { + return OpenProjectTask(isNewProject = true, runConfigurators = runConfigurators) } @JvmStatic - fun newProjectWithCallback(projectToClose: Project?, callback: ProjectOpenedCallback?, isRefreshVfsNeeded: Boolean): OpenProjectTask { - return OpenProjectTask(projectToClose = projectToClose, isNewProject = true, callback = callback, isRefreshVfsNeeded = isRefreshVfsNeeded) + fun newProjectAndRunConfigurators(projectToClose: Project?, isRefreshVfsNeeded: Boolean): OpenProjectTask { + return OpenProjectTask(isNewProject = true, projectToClose = projectToClose, runConfigurators = true, isRefreshVfsNeeded = isRefreshVfsNeeded) } @JvmStatic - fun withProjectToClose(projectToClose: Project?): OpenProjectTask { - return OpenProjectTask(projectToClose = projectToClose, project = null) + @JvmOverloads + fun withProjectToClose(projectToClose: Project?, forceOpenInNewFrame: Boolean = false): OpenProjectTask { + return OpenProjectTask(projectToClose = projectToClose, project = null, forceOpenInNewFrame = forceOpenInNewFrame) } @JvmStatic - fun withCreatedProject(project: Project?, contentRoot: Path?): OpenProjectTask { - return OpenProjectTask(project = project, contentRoot = contentRoot) + fun withCreatedProject(project: Project?): OpenProjectTask { + return OpenProjectTask(project = project) } } diff --git a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java index 573abbc81f78..22eee33ad35d 100644 --- a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java @@ -111,7 +111,11 @@ public final class ProjectUtil { } public static Project openOrImport(@NotNull Path path, Project projectToClose, boolean forceOpenInNewFrame) { - return openOrImport(path, new OpenProjectTask(forceOpenInNewFrame, projectToClose)); + return openOrImport(path, OpenProjectTask.withProjectToClose(projectToClose, forceOpenInNewFrame)); + } + + public static Project openOrImport(@NotNull Path path) { + return openOrImport(path, new OpenProjectTask()); } /** @@ -122,8 +126,8 @@ public final class ProjectUtil { * installed importers (regardless of opening/import result) * null otherwise */ - public static @Nullable Project openOrImport(@NotNull String path, Project projectToClose, boolean forceOpenInNewFrame) { - return openOrImport(Paths.get(path), new OpenProjectTask(forceOpenInNewFrame, projectToClose)); + public static @Nullable Project openOrImport(@NotNull String path, @Nullable Project projectToClose, boolean forceOpenInNewFrame) { + return openOrImport(Paths.get(path), OpenProjectTask.withProjectToClose(projectToClose, forceOpenInNewFrame)); } public static @Nullable Project openOrImport(@NotNull Path file, @NotNull OpenProjectTask options) { @@ -151,7 +155,7 @@ public final class ProjectUtil { } if (isValidProjectPath(file)) { - return ProjectManagerEx.getInstanceEx().loadAndOpenProject(file, options); + return ProjectManagerEx.getInstanceEx().openProject(file, options); } if (options.checkDirectoryForFileBasedProjects && Files.isDirectory(file)) { @@ -206,8 +210,7 @@ public final class ProjectUtil { @NotNull Path file, @NotNull OpenProjectTask options) { if (processors.size() == 1 && processors.get(0) instanceof PlatformProjectOpenProcessor) { - options.isNewProject = !isValidProjectPath(file); - Project project = PlatformProjectOpenProcessor.doOpenProject(file, options); + Project project = PlatformProjectOpenProcessor.doOpenProject(file, options.withNewProject(!isValidProjectPath(file))); if (project != null) { project.putUserData(PlatformProjectOpenProcessor.PROJECT_OPENED_BY_PLATFORM_PROCESSOR, Boolean.TRUE); } @@ -223,7 +226,7 @@ public final class ProjectUtil { ApplicationManager.getApplication().invokeAndWait(() -> { ProjectOpenProcessor processor = selectOpenProcessor(processors, virtualFile); if (processor != null) { - Project project = processor.doOpenProject(virtualFile, options.projectToClose, options.forceOpenInNewFrame); + Project project = processor.doOpenProject(virtualFile, options.getProjectToClose(), options.getForceOpenInNewFrame()); if (project != null && processor instanceof PlatformProjectOpenProcessor) { project.putUserData(PlatformProjectOpenProcessor.PROJECT_OPENED_BY_PLATFORM_PROCESSOR, Boolean.TRUE); } @@ -259,7 +262,7 @@ public final class ProjectUtil { } public static @Nullable Project openProject(@NotNull String path, @Nullable Project projectToClose, boolean forceOpenInNewFrame) { - return openProject(Paths.get(path), new OpenProjectTask(forceOpenInNewFrame, projectToClose)); + return openProject(Paths.get(path), OpenProjectTask.withProjectToClose(projectToClose, forceOpenInNewFrame)); } public static @Nullable Project openProject(@NotNull Path file, @NotNull OpenProjectTask options) { @@ -289,7 +292,7 @@ public final class ProjectUtil { } try { - return ProjectManagerEx.getInstanceEx().loadAndOpenProject(file, options); + return ProjectManagerEx.getInstanceEx().openProject(file, options); } catch (Exception e) { Messages.showMessageDialog(IdeBundle.message("error.cannot.load.project", e.getMessage()), @@ -490,7 +493,7 @@ public final class ProjectUtil { Project result = null; for (File file : list) { - result = openOrImport(file.toPath().toAbsolutePath(), project, true); + result = openOrImport(file.toPath().toAbsolutePath(), OpenProjectTask.withProjectToClose(project, true)); if (result != null) { LOG.debug(location + ": load project from ", file); return result; diff --git a/platform/platform-impl/src/com/intellij/openapi/project/ex/ProjectManagerEx.java b/platform/platform-impl/src/com/intellij/openapi/project/ex/ProjectManagerEx.java index d1b2cc284044..a43d54d4ad51 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/ex/ProjectManagerEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/ex/ProjectManagerEx.java @@ -24,8 +24,9 @@ public abstract class ProjectManagerEx extends ProjectManager { } /** - * @param filePath path to .ipr file or directory where .idea directory is located + * @deprecated Use {@link #newProject(Path, OpenProjectTask)} */ + @Deprecated public abstract @Nullable Project newProject(@Nullable String projectName, @NotNull String filePath, boolean useDefaultProjectSettings, boolean isDummy); /** @@ -46,8 +47,7 @@ public abstract class ProjectManagerEx extends ProjectManager { return loadProject(Paths.get(filePath).toAbsolutePath()); } - @ApiStatus.Internal - public abstract @Nullable Project loadAndOpenProject(@NotNull Path projectStoreBaseDir, @NotNull OpenProjectTask options); + public abstract @Nullable Project openProject(@NotNull Path projectStoreBaseDir, @NotNull OpenProjectTask options); public abstract @NotNull Project loadProject(@NotNull Path path); @@ -68,17 +68,6 @@ public abstract class ProjectManagerEx extends ProjectManager { // return true if successful public abstract boolean closeAndDisposeAllProjects(boolean checkCanClose); - /** - * Save, close and dispose project. Please note that only the project will be saved, but not the application. - * @return true on success - */ - public abstract boolean closeAndDispose(@NotNull Project project); - - @Override - public @Nullable Project createProject(@Nullable String name, @NotNull String path) { - return newProject(name, path, true, false); - } - public abstract @Nullable Project findOpenProjectByHash(@Nullable String locationHash); @ApiStatus.Internal diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectFrameAllocator.kt b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectFrameAllocator.kt index 98d95d0b9d4d..854971404e6b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectFrameAllocator.kt +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectFrameAllocator.kt @@ -39,7 +39,7 @@ import kotlin.math.min internal open class ProjectFrameAllocator { companion object { internal fun getPresentableName(options: OpenProjectTask, projectStoreBaseDir: Path): String { - return options.projectName ?: (options.contentRoot ?: projectStoreBaseDir).fileName.toString() + return options.projectName ?: projectStoreBaseDir.fileName.toString() } } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerExImpl.kt b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerExImpl.kt index 9a358b563f7b..25dc4d9eb70b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerExImpl.kt +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerExImpl.kt @@ -26,7 +26,6 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectBundle import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.startup.StartupManager -import com.intellij.openapi.util.io.FileUtilRt import com.intellij.openapi.wm.IdeFocusManager import com.intellij.openapi.wm.impl.welcomeScreen.WelcomeFrame import com.intellij.platform.PlatformProjectOpenProcessor @@ -42,13 +41,20 @@ import java.util.concurrent.Future @ApiStatus.Internal open class ProjectManagerExImpl : ProjectManagerImpl() { - override fun loadAndOpenProject(originalFilePath: String): Project? { - val projectStoreBaseDir = Paths.get(FileUtilRt.toSystemIndependentName(toCanonicalName(originalFilePath))) - return loadAndOpenProject(projectStoreBaseDir, OpenProjectTask()) + final override fun createProject(name: String?, path: String): Project? { + return newProject(Paths.get(toCanonicalName(path)), OpenProjectTask(isNewProject = true, runConfigurators = false).withProjectName(name)) } - override fun loadAndOpenProject(projectStoreBaseDir: Path, options: OpenProjectTask): Project? { - return openExistingProject(projectStoreBaseDir, options, this) + final override fun newProject(projectName: String?, path: String, useDefaultProjectAsTemplate: Boolean, isDummy: Boolean): Project? { + return newProject(Paths.get(toCanonicalName(path)), OpenProjectTask(isNewProject = true, useDefaultProjectAsTemplate = useDefaultProjectAsTemplate, projectName = projectName)) + } + + final override fun loadAndOpenProject(originalFilePath: String): Project? { + return openProject(Paths.get(toCanonicalName(originalFilePath)), OpenProjectTask()) + } + + final override fun openProject(projectStoreBaseDir: Path, options: OpenProjectTask): Project? { + return doOpenProject(projectStoreBaseDir, options, this) } @ApiStatus.Internal @@ -77,7 +83,7 @@ open class ProjectManagerExImpl : ProjectManagerImpl() { } } -private fun openExistingProject(projectStoreBaseDir: Path, options: OpenProjectTask, projectManager: ProjectManagerExImpl): Project? { +private fun doOpenProject(projectStoreBaseDir: Path, options: OpenProjectTask, projectManager: ProjectManagerExImpl): Project? { if (options.project != null && projectManager.isProjectOpened(options.project)) { return null } @@ -115,7 +121,7 @@ private fun openExistingProject(projectStoreBaseDir: Path, options: OpenProjectT val project = result.project frameAllocator.projectLoaded(project) - if ((options.beforeProjectOpen == null || options.beforeProjectOpen.test(project, result.module)) && projectManager.doOpenProject(project)) { + if (projectManager.doOpenProject(project)) { frameAllocator.projectOpened(project) result } @@ -152,12 +158,13 @@ private fun prepareProject(options: OpenProjectTask, projectStoreBaseDir: Path, indicator?.text = "" } - if (project == null) { + if (project == null || (options.beforeProjectOpen != null && !options.beforeProjectOpen.test(project))) { return null } - if (options.isNewProject || (options.runConfiguratorsIfNoModules && ModuleManager.getInstance(project).modules.isEmpty())) { + if (options.runConfigurators && (options.isNewProject || ModuleManager.getInstance(project).modules.isEmpty())) { val module = PlatformProjectOpenProcessor.runDirectoryProjectConfigurators(projectStoreBaseDir, project, options.isNewProject) + options.preparedToOpen?.invoke(module) return PrepareProjectResult(project, module) } else { @@ -165,7 +172,32 @@ private fun prepareProject(options: OpenProjectTask, projectStoreBaseDir: Path, } } -private fun checkExistingProjectOnOpen(projectToClose: Project, callback: ProjectOpenedCallback?, projectDir: Path?, projectManager: ProjectManagerExImpl): Boolean { +private fun convertAndLoadProject(path: Path, options: OpenProjectTask): Project? { + var conversionResult: ConversionResult? = null + if (options.runConversionBeforeOpen) { + conversionResult = runMainActivity("project conversion") { + ConversionService.getInstance().convert(path) + } + if (conversionResult.openingIsCanceled()) { + return null + } + } + + val project = ProjectManagerImpl.instantiateProject(path, options.projectName) + // template as null because convertAndLoadProject method is called only for an existing project + ProjectManagerImpl.initProject(path, project, options.isRefreshVfsNeeded, null, ProgressManager.getInstance().progressIndicator) + if (conversionResult != null && !conversionResult.conversionNotNeeded()) { + StartupManager.getInstance(project).runAfterOpened { + conversionResult.postStartupActivity(project) + } + } + return project +} + +private fun checkExistingProjectOnOpen(projectToClose: Project, + callback: ProjectOpenedCallback?, + projectDir: Path?, + projectManager: ProjectManagerExImpl): Boolean { val settings = GeneralSettings.getInstance() val isValidProject = projectDir != null && ProjectUtil.isValidProjectPath(projectDir) if (projectDir != null && ProjectAttachProcessor.canAttachToProject() && @@ -203,27 +235,6 @@ private fun checkExistingProjectOnOpen(projectToClose: Project, callback: Projec return false } -private fun convertAndLoadProject(path: Path, options: OpenProjectTask): Project? { - var conversionResult: ConversionResult? = null - if (options.runConversionBeforeOpen) { - conversionResult = runMainActivity("project conversion") { - ConversionService.getInstance().convert(path) - } - if (conversionResult.openingIsCanceled()) { - return null - } - } - - val project = ProjectManagerImpl.instantiateProject(path, options.projectName) - ProjectManagerImpl.initProject(path, project, options.isRefreshVfsNeeded, null, ProgressManager.getInstance().progressIndicator) - if (conversionResult != null && !conversionResult.conversionNotNeeded()) { - StartupManager.getInstance(project).registerPostStartupActivity { - conversionResult.postStartupActivity(project) - } - } - return project -} - private fun openProject(project: Project, indicator: ProgressIndicator?): Future<*> { val waitEdtActivity = StartUpMeasurer.startMainActivity("placing calling projectOpened on event queue") if (indicator != null) { diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index c4289f1c79d7..341ea6c1bce1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -51,7 +51,6 @@ import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.List; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -163,10 +162,6 @@ public abstract class ProjectManagerImpl extends ProjectManagerEx implements Dis private static long CHECK_START = System.currentTimeMillis(); private final Map myProjects = new WeakHashMap<>(); - @Override - public @Nullable Project newProject(@Nullable String projectName, @NotNull String filePath, boolean useDefaultProjectSettings, boolean isDummy) { - return newProject(Paths.get(toCanonicalName(filePath)), OpenProjectTask.newProject(useDefaultProjectSettings).withProjectName(projectName)); - } @Override public @Nullable Project newProject(@NotNull Path projectFile, @NotNull OpenProjectTask options) { @@ -179,7 +174,7 @@ public abstract class ProjectManagerImpl extends ProjectManagerEx implements Dis if (Files.isRegularFile(projectFile)) { try { - FileUtil.delete(projectFile); + Files.deleteIfExists(projectFile); } catch (IOException ignored) { } @@ -196,7 +191,7 @@ public abstract class ProjectManagerImpl extends ProjectManagerEx implements Dis ProjectImpl project = instantiateProject(projectFile, options.getProjectName()); try { - Project template = options.useDefaultProjectAsTemplate ? getDefaultProject() : null; + Project template = options.getUseDefaultProjectAsTemplate() ? getDefaultProject() : null; initProject(projectFile, project, options.isRefreshVfsNeeded(), template, ProgressManager.getInstance().getProgressIndicator()); if (LOG_PROJECT_LEAKAGE_IN_TESTS) { myProjects.put(project, null); diff --git a/platform/platform-impl/src/com/intellij/platform/PlatformProjectOpenProcessor.kt b/platform/platform-impl/src/com/intellij/platform/PlatformProjectOpenProcessor.kt index d5c797981d82..c89ff8e2878a 100644 --- a/platform/platform-impl/src/com/intellij/platform/PlatformProjectOpenProcessor.kt +++ b/platform/platform-impl/src/com/intellij/platform/PlatformProjectOpenProcessor.kt @@ -29,7 +29,6 @@ import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.util.* -import java.util.function.BiPredicate private val LOG = logger() private val EP_NAME = ExtensionPointName("com.intellij.directoryProjectConfigurator") @@ -80,7 +79,11 @@ class PlatformProjectOpenProcessor : ProjectOpenProcessor(), CommandLineProjectO line: Int, callback: ProjectOpenedCallback?, options: EnumSet