From 2f210ebad9a2b6ac1369f72dc3b981b227fb2fe1 Mon Sep 17 00:00:00 2001 From: Leonid Shalupov Date: Thu, 6 Sep 2018 18:30:04 +0300 Subject: [PATCH] Replace usages of ProjectManagerImpl with ProjectManagerEx IDEA-199211 Refactor code dependent on project model implementation IDEA-CR-36813 --- .../src/StoreAwareProjectManager.kt | 3 ++- .../application/impl/ApplicationImpl.java | 3 +-- .../openapi/project/ex/ProjectManagerEx.java | 12 ++++++++++++ .../project/impl/ProjectManagerImpl.java | 4 ++++ .../vfs/ex/dummy/DummyCachingFileSystem.java | 4 ++-- .../testFramework/EditorListenerTracker.java | 7 +++---- .../com/intellij/testFramework/FixtureRule.kt | 9 ++++----- .../testFramework/LightPlatformTestCase.java | 2 +- .../testFramework/PlatformTestCase.java | 17 ++++++----------- .../intellij/testFramework/ThreadTracker.java | 7 +++---- 10 files changed, 38 insertions(+), 30 deletions(-) diff --git a/platform/configuration-store-impl/src/StoreAwareProjectManager.kt b/platform/configuration-store-impl/src/StoreAwareProjectManager.kt index 44e3d1fe9fbc..97b57a072e68 100644 --- a/platform/configuration-store-impl/src/StoreAwareProjectManager.kt +++ b/platform/configuration-store-impl/src/StoreAwareProjectManager.kt @@ -18,6 +18,7 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectBundle +import com.intellij.openapi.project.ex.ProjectManagerEx import com.intellij.openapi.project.impl.ProjectManagerImpl import com.intellij.openapi.ui.Messages import com.intellij.openapi.util.Key @@ -107,7 +108,7 @@ class StoreAwareProjectManager(virtualFileManager: VirtualFileManager, progressM return } - if (event.requestor is StateStorage.SaveSession || event.requestor is StateStorage || event.requestor is ProjectManagerImpl) { + if (event.requestor is StateStorage.SaveSession || event.requestor is StateStorage || event.requestor is ProjectManagerEx) { return } diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index e0ef5e12b1b5..53cfc9243c19 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -38,7 +38,6 @@ import com.intellij.openapi.progress.util.ProgressWindow; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ex.ProjectManagerEx; -import com.intellij.openapi.project.impl.ProjectManagerImpl; import com.intellij.openapi.ui.DialogEarthquakeShaker; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.MessageDialogBuilder; @@ -231,7 +230,7 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App } private boolean disposeSelf(final boolean checkCanCloseProject) { - final ProjectManagerImpl manager = (ProjectManagerImpl)ProjectManagerEx.getInstanceEx(); + final ProjectManagerEx manager = ProjectManagerEx.getInstanceEx(); if (manager == null) { saveSettings(true); } 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 750cf55bdcc3..92ee04f4f726 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 @@ -45,6 +45,9 @@ public abstract class ProjectManagerEx extends ProjectManager { public abstract boolean openProject(@NotNull Project project); + @TestOnly + public abstract boolean isDefaultProjectInitialized(); + public abstract boolean isProjectOpened(Project project); public abstract boolean canClose(@NotNull Project project); @@ -65,6 +68,12 @@ public abstract class ProjectManagerEx extends ProjectManager { @NotNull public abstract Collection closeTestProject(@NotNull Project project); + @TestOnly + public abstract boolean forceCloseProject(@NotNull Project project, boolean dispose); + + // return true if successful + public abstract boolean closeAndDisposeAllProjects(boolean checkCanClose); + // returns true on success public abstract boolean closeAndDispose(@NotNull Project project); @@ -74,6 +83,9 @@ public abstract class ProjectManagerEx extends ProjectManager { return newProject(name, path, true, false); } + @Nullable + public abstract Project findOpenProjectByHash(@Nullable String locationHash); + @Nullable public abstract Project convertAndLoadProject(@NotNull String filePath) throws IOException; 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 936c78b2c8dc..19be1226ac40 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 @@ -333,6 +333,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { return filePath; } + @Override @TestOnly public synchronized boolean isDefaultProjectInitialized() { return myDefaultProject != null; @@ -469,6 +470,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { } } + @Override @Nullable public Project findOpenProjectByHash(@Nullable String locationHash) { return myOpenProjectByHash.get(locationHash); @@ -621,12 +623,14 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { return closeProject(project, true, true, false, true); } + @Override @TestOnly public boolean forceCloseProject(@NotNull Project project, boolean dispose) { return closeProject(project, false, false, dispose, false); } // return true if successful + @Override public boolean closeAndDisposeAllProjects(boolean checkCanClose) { for (Project project : getOpenProjects()) { if (!closeProject(project, true, false, true, checkCanClose)) { diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java index b6447d86ab41..e43bd2a7e68a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java @@ -7,7 +7,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ProjectManagerListener; -import com.intellij.openapi.project.impl.ProjectManagerImpl; +import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; @@ -86,7 +86,7 @@ public abstract class DummyCachingFileSystem extends Dumm @Nullable public Project getProject(@Nullable String projectId) { - Project project = ((ProjectManagerImpl)ProjectManager.getInstance()).findOpenProjectByHash(projectId); + Project project = ProjectManagerEx.getInstanceEx().findOpenProjectByHash(projectId); if (ApplicationManager.getApplication().isUnitTestMode() && project != null) { registerDisposeCallback(project); DISPOSE_CALLBACK.set(project, Boolean.TRUE); diff --git a/platform/testFramework/src/com/intellij/testFramework/EditorListenerTracker.java b/platform/testFramework/src/com/intellij/testFramework/EditorListenerTracker.java index 147ddd75f6f1..c523fd15f4bf 100644 --- a/platform/testFramework/src/com/intellij/testFramework/EditorListenerTracker.java +++ b/platform/testFramework/src/com/intellij/testFramework/EditorListenerTracker.java @@ -17,8 +17,7 @@ package com.intellij.testFramework; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.impl.event.EditorEventMulticasterImpl; -import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.project.impl.ProjectManagerImpl; +import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.vfs.encoding.EncodingManager; import com.intellij.util.containers.hash.LinkedHashMap; import org.jetbrains.annotations.TestOnly; @@ -40,13 +39,13 @@ public class EditorListenerTracker { public EditorListenerTracker() { EncodingManager.getInstance(); //adds listeners before = ((EditorEventMulticasterImpl)EditorFactory.getInstance().getEventMulticaster()).getListeners(); - myDefaultProjectInitialized = ((ProjectManagerImpl)ProjectManager.getInstance()).isDefaultProjectInitialized(); + myDefaultProjectInitialized = ProjectManagerEx.getInstanceEx().isDefaultProjectInitialized(); } public void checkListenersLeak() throws AssertionError { try { // listeners may hang on default project - if (myDefaultProjectInitialized != ((ProjectManagerImpl)ProjectManager.getInstance()).isDefaultProjectInitialized()) return; + if (myDefaultProjectInitialized != ProjectManagerEx.getInstanceEx().isDefaultProjectInitialized()) return; EditorEventMulticasterImpl multicaster = (EditorEventMulticasterImpl)EditorFactory.getInstance().getEventMulticaster(); Map, List> after = multicaster.getListeners(); diff --git a/platform/testFramework/src/com/intellij/testFramework/FixtureRule.kt b/platform/testFramework/src/com/intellij/testFramework/FixtureRule.kt index f47501de6f49..1bf766dbbf53 100644 --- a/platform/testFramework/src/com/intellij/testFramework/FixtureRule.kt +++ b/platform/testFramework/src/com/intellij/testFramework/FixtureRule.kt @@ -13,7 +13,6 @@ import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project -import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.project.ex.ProjectEx import com.intellij.openapi.project.ex.ProjectManagerEx import com.intellij.openapi.project.impl.ProjectManagerImpl @@ -86,7 +85,7 @@ class ProjectRule(val projectDescriptor: LightProjectDescriptor = LightProjectDe val project = sharedProject ?: return sharedProject = null sharedModule = null - (ProjectManager.getInstance() as ProjectManagerImpl).forceCloseProject(project, true) + ProjectManagerEx.getInstanceEx().forceCloseProject(project, true) // TODO uncomment and figure out where to put this statement // (VirtualFilePointerManager.getInstance() as VirtualFilePointerManagerImpl).assertPointersAreDisposed() } @@ -94,7 +93,7 @@ class ProjectRule(val projectDescriptor: LightProjectDescriptor = LightProjectDe public override fun after() { if (projectOpened.compareAndSet(true, false)) { - sharedProject?.let { runInEdtAndWait { (ProjectManager.getInstance() as ProjectManagerImpl).forceCloseProject(it, false) } } + sharedProject?.let { runInEdtAndWait { ProjectManagerEx.getInstanceEx().forceCloseProject(it, false) } } } } @@ -226,7 +225,7 @@ inline fun Project.runInLoadComponentStateMode(task: () -> T): T { fun createHeavyProject(path: String, useDefaultProjectSettings: Boolean = false): Project = ProjectManagerEx.getInstanceEx().newProject(null, path, useDefaultProjectSettings, false)!! fun Project.use(task: (Project) -> Unit) { - val projectManager = ProjectManagerEx.getInstanceEx() as ProjectManagerImpl + val projectManager = ProjectManagerEx.getInstanceEx() try { runInEdtAndWait { projectManager.openTestProject(this) } task(this) @@ -238,7 +237,7 @@ fun Project.use(task: (Project) -> Unit) { class DisposeNonLightProjectsRule : ExternalResource() { override fun after() { - val projectManager = if (ApplicationManager.getApplication().isDisposed) null else ProjectManager.getInstance() as ProjectManagerImpl + val projectManager = if (ApplicationManager.getApplication().isDisposed) null else ProjectManagerEx.getInstanceEx() projectManager?.openProjects?.forEachGuaranteed { if (!ProjectManagerImpl.isLight(it)) { runInEdtAndWait { projectManager.forceCloseProject(it, true) } diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index ea2dad771bd5..290eec5c2766 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -479,7 +479,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da PsiDocumentManagerImpl documentManager = (PsiDocumentManagerImpl)PsiDocumentManager.getInstance(project); documentManager.clearUncommittedDocuments(); - ProjectManagerImpl projectManager = (ProjectManagerImpl)ProjectManager.getInstance(); + ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx(); if (projectManager.isDefaultProjectInitialized()) { Project defaultProject = projectManager.getDefaultProject(); ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(defaultProject)).clearUncommittedDocuments(); diff --git a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java index 3a329deb0786..3f3ebc7f626a 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java @@ -30,10 +30,8 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.project.impl.ProjectImpl; -import com.intellij.openapi.project.impl.ProjectManagerImpl; import com.intellij.openapi.project.impl.TooManyProjectLeakedException; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootModificationUtil; @@ -435,10 +433,9 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro ((PsiManagerImpl)PsiManager.getInstance(project)).cleanupForNextTest(); } - final ProjectManager projectManager = ProjectManager.getInstance(); + final ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx(); assert projectManager != null : "The ProjectManager is not initialized yet"; - ProjectManagerImpl projectManagerImpl = (ProjectManagerImpl)projectManager; - if (projectManagerImpl.isDefaultProjectInitialized()) { + if (projectManager.isDefaultProjectInitialized()) { Project defaultProject = projectManager.getDefaultProject(); ((PsiManagerImpl)PsiManager.getInstance(defaultProject)).cleanupForNextTest(); } @@ -570,12 +567,10 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro public static void closeAndDisposeProjectAndCheckThatNoOpenProjects(@NotNull final Project projectToClose) { RunAll runAll = new RunAll(); ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx(); - if (projectManager instanceof ProjectManagerImpl) { - for (Project project : projectManager.closeTestProject(projectToClose)) { - runAll = runAll - .append(() -> { throw new IllegalStateException("Test project is not disposed: " + project + ";\n created in: " + getCreationPlace(project)); }) - .append(() -> ((ProjectManagerImpl)projectManager).forceCloseProject(project, true)); - } + for (Project project : projectManager.closeTestProject(projectToClose)) { + runAll = runAll + .append(() -> { throw new IllegalStateException("Test project is not disposed: " + project + ";\n created in: " + getCreationPlace(project)); }) + .append(() -> projectManager.forceCloseProject(project, true)); } runAll.append(() -> WriteAction.run(() -> Disposer.dispose(projectToClose))).run(); } diff --git a/platform/testFramework/src/com/intellij/testFramework/ThreadTracker.java b/platform/testFramework/src/com/intellij/testFramework/ThreadTracker.java index bfeac2f4500c..26d116b252fe 100644 --- a/platform/testFramework/src/com/intellij/testFramework/ThreadTracker.java +++ b/platform/testFramework/src/com/intellij/testFramework/ThreadTracker.java @@ -7,8 +7,7 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.project.impl.ProjectManagerImpl; +import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.text.StringUtil; @@ -45,7 +44,7 @@ public class ThreadTracker { @TestOnly public ThreadTracker() { before = getThreads(); - myDefaultProjectInitialized = ((ProjectManagerImpl)ProjectManager.getInstance()).isDefaultProjectInitialized(); + myDefaultProjectInitialized = ProjectManagerEx.getInstanceEx().isDefaultProjectInitialized(); } private static final Method getThreads = ReflectionUtil.getDeclaredMethod(Thread.class, "getThreads"); @@ -132,7 +131,7 @@ public class ThreadTracker { NettyUtil.awaitQuiescenceOfGlobalEventExecutor(100, TimeUnit.SECONDS); ShutDownTracker.getInstance().waitFor(100, TimeUnit.SECONDS); try { - if (myDefaultProjectInitialized != ((ProjectManagerImpl)ProjectManager.getInstance()).isDefaultProjectInitialized()) return; + if (myDefaultProjectInitialized != ProjectManagerEx.getInstanceEx().isDefaultProjectInitialized()) return; Collection after = new THashSet<>(getThreads()); after.removeAll(before);